創建單鏈表c語言
『壹』 c語言 單鏈表的創建
*creat a list*/
#include "stdlib.h"
#include "stdio.h"
struct list
{ int data;
struct list *next;
};
typedef struct list node;
typedef node *link;
void main()
{ link ptr,head;
int num,i;
ptr=(link)malloc(sizeof(node));
ptr=head;
printf("please input 5 numbers==>\n");
for(i=0;i<=4;i++)
{
scanf("%d",&num);
ptr->data=num;
ptr->next=(link)malloc(sizeof(node));
if(i==4) ptr->next=NULL;
else ptr=ptr->next;
}
ptr=head;
while(ptr!=NULL)
{ printf("The value is ==>%d\n",ptr->data);
ptr=ptr->next;
}
}
上面是一個簡單的創建鏈表的C程序。所謂鏈表形象的講就是一個數據塊裡面存有數據,並且存有下一個數據的指針,這樣一個指一個形成一個數據鏈。這個數據鏈可以被操作,例如插入數據,刪除數據,等。至於指令,首先定義一個結構體,它存有數據和指向下一個數據塊的指針。然後分配空間。注意最後一個為NULL,當然你也可以指向開頭一個數據塊形成一個循環鏈表
『貳』 如何用C語言創建單鏈表!!!!!
用一個結構體
struct Node{
int value;
struct Node *next;
};
value是這個元素的值,*next是指向想一個或頌元素的指針,
跟數組的比較,數組可以直接通過下標查詢其中的元素比如a[9],而單鏈表只能遍歷第9個元素以前的所有元素才能找到第9個元素。單鏈沖舉表的插散團碧入和刪除比數組簡單
『叄』 C語言中單鏈表的創建
struct infor
{
char name[10];//學生名稱
int age;//年齡
struct infor *next;//存儲下一個結構的地址
};//鏈表的數據結構
struct infor *head=NULL;//頭指針,指向第一個結構
struct infor *p,*c;//*p:是當前結構的前一個結構地址;*c:當前指針
char buf[10];//存放name的臨時數組
printf("Enter name:");//提示
while(scanf("%s",buf)==1 && buf[0]!='0')//name輸入0時結束
{
c=(struct infor *)malloc(sizeof(struct infor));//給結構分配內存
if(c==NULL)/無法分配內存
{
printf("No memory");
exit(1);
}
if(head==NULL)
{
head=c;//第一個結構核碧地址
}
else
{
p->next=c;//下一個結構的地址
}
c->next=NULL;//表示最後一個結構
strcpy(c->name,buf);//拷貝name到鏈表中
printf("Enter age:");
scanf("%d",&c->age);//輸入年齡
p=c;//指向埋氏陵前一個節點
printf("Enter name:");
}
c=head;
while(c!=NULL)
{
printf("name=%s age=%d\n",c->name,c->age);
c=c->next;
}//讀取鏈表中的信息
printf("over\n");
c=head;
while(c!=NULL)
{
free(c);
c=c->next;
}//釋放內存
運行結果:
Enter name:Jim
Enter age:25
Enter name:Tom
Enter age:36
Enter name:Jack
Enter age:65
Enter name:0
name=Jim age=25
name=Tom age=36
name=Jack age=65
over
//以上程序直接加到主函數中運行正彎戚常
『肆』 c語言構建一個最簡單的單鏈表
typedef struct node { char name[20]; struct node *link; }stud; 下面就來看一個建立帶表頭搜弊(若未說明,以下所指 鏈表 均帶表頭)的單 鏈表 的完整程序。 #include <stdio.h> #include <malloc.h> /*包含動態內存分配函數的頭文件*/ #define N 10 /*N為人數*/ typedef struct node { char name[20]; struct node *link; }stud; stud * creat(int n) /*建立單 鏈表 的函數,形參n為人數*/ { stud *p,*h,*s; /* *h保存表頭結點的指針,*p指向當前結點的前一個世碰族結點,*s指向當前結點*/ int i; /*計數器*/ if((h=(stud *)malloc(sizeof(stud)))==NULL) /*分配空間並檢測*/ { printf("不能分配內存空間!"); exit(0); } h->name[0]='\0'; /*把表頭結點的數據域置空*/ h->link=NULL; /*把表頭結點的鏈域置空*/ p=h; /*p指向表頭結點*/ for(i=0;i<n;i++) { if((s= (stud *) malloc(sizeof(stud)))==NULL) /*分配新存儲空間並檢測*/ { printf("不能分配內存空間!"); exit(0); } p->link=s; /*把s的地址賦給p所指向的結點的鏈域,這樣就把p和s所指向的結點連接起來了*/ printf("請輸入第%d個人的姓名",i+1); scanf("%s",s->name); /*在當前結點s的數據域中存儲姓名*/ s->link=NULL; p=s; } return(h); } main() { int number; /*保存人數的變數*/ stud *head; /*head是保存單 鏈表 的表頭結點地址的指針*/ number=N; head=creat(number); /*把所新建的單 鏈表 表頭地址賦給head*/ } 這樣就寫好了一個可以建吵蘆立包含N個人姓名的單 鏈表 了。寫動態內存分配的程序應注意,請盡量對分配是否成功進行檢測。
『伍』 c語言創建單鏈表
#include<stdio.h>
#include<stdlib.h>
/*線性表*/
struct TLink {
int data;
struct TLink * next;
};/*end struct TLink*/
/*生成新元素*/
struct TLink * new_item(int number)
{
struct TLink * r = 0;
r = (struct TLink *)malloc(sizeof(struct TLink));
r->data = number;
r->next = 0;
return r;
}/*end new_item*/
/*在線性表中查詢數據*/
struct TLink * lookup(struct TLink * root, int number)
{
struct TLink * h = root;
while(h) {
if (h->data == number) return h;
h = h->next ;
}/*end lookup*/
return 0;
}
/*在線性表中追加一個數據*/
void append(struct TLink * * root, int number)
{
struct TLink * r = 0, * n = 0;
if (!root) return ;
/*不記錄重復元素*/
if (lookup(*root, number)) return;
/*如果表為空則新建表*/
r = *root;
if (!r) {
*root = new_item(number);
return ;
}/*end if*/
/*為保證為有序線性表,如果數據比表頭還小則作為表頭*/
if (number < r->data ) {
n = new_item(number);
n->next = r;
*root = n;
return ;
}/*end if*/
/*在有序線性表中查找位置插入元素*/
while(r) {
n = r->next ;
/*如果已經是表尾則直接追加*/
if (!n) {
n = new_item(number);
r->next = n;
return ;
}/*end if*/
/*在中央某處插入*/
if (number < n->data ) {
r->next = new_item(number);
r->next->next = n;
return ;
}/*end if*/
r = n;
}/*end while*/
}/*end append*/
/*列印有序線性表*/
void print(struct TLink * root)
{
struct TLink * r = root;
printf("【");
while(r) {
printf("%d ", r->data );
r = r->next ;
}/*end while*/
printf("\b】\n");
}/*end print*/
/*將有序線性表h1合並至有序線性表h0,並銷毀線性表h1*/
void merge(struct TLink ** h0, struct TLink ** h1)
{
struct TLink * h = 0, * k = 0;
if (!h0 || !h1) return ;
h = *h1;
while(h) {
append(h0, h->data );
k = h;
h = h->next ;
free(k);
}/*end h*/
h1 = 0;
}
int main(void)
{
int i = 0; struct TLink * x=0, *y = 0;
int a[] = {8,4,3,9,5,1};
int b[] = {7,2,1,5,6,0};
printf("原數據為:\n數組A:【");
for(i = 0; i < 6; i++) {
printf("%d ", a[i]);
append(&x, a[i]);
}/*next*/
printf("\b】\n數組B:【");
for(i = 0; i < 6; i++) {
printf("%d ", b[i]);
append(&y, b[i]);
}/*next*/
printf("\b】\n轉換為有序線性表\nA:");
print(x);
printf("B:");
print(y);
printf("AB合並後為:");
merge(&x, &y);
print(x);
return 0;
}
/*以上是順序線性表的合並程序,逆序只需將插入條件從小於改為大於即可。
合並結果如果要保留,把合並函數的lookup調用刪除即可*/
『陸』 用C語言創建一個具有10個元素的單鏈表
#include <stdio.h>
#include<stdlib.h>
typedef struct List
{
int e;
struct List *next;
}List;
void initList(List *head)
{
int n,i;
List *p,*q;
scanf("%d",&n);
p=head;
for(i=0;i<n;i++)
{
q=(List*)malloc(sizeof(List));
if(!q)
return;
scanf("%d",&q->e);
q->next=NULL;
p->next=q;
p=p->next;
}
}
void displayList(List *head)
{
List *p;
for(p=head->next;p;p=p->next)
printf("%d ",p->e );
printf(" ");
}
void destoryList(List *head)
{
List *p;
while(head->next) {
p=head->next;
head->next=p->next;
free(p);
}
free(head);
}
void insertList(List *head,int x)
{
List *p=head;
while(p->next) {
p=p->念陪next;
}
p->next=(List*)malloc(sizeof(List));
p->next->e=x;
p->next->仔冊蠢next=NULL;
}
void deleteList(List *head,int x)
{
List *p,*pre;
int flag=1;
for(p=head->next;p;p=p->next)
{
if(p->e==x)
{
pre->next=p->next;
free(p);
p=pre;
flag=0;
}
pre=p;
}
if(flag)
printf("No element to delete! ");
}
int main()
{
int x;
List *head=(List*)malloc(sizeof(List));
initList(head);
displayList(head);
printf("Input a integer to insert:");
scanf("%d",&x);
insertList(head,x);
printf("Processed list:");
displayList(head);
printf("Input a integer to delete:");
scanf("%d",&x);
deleteList(head,x);
printf("Processed list:");
displayList(head);
destoryList(head);
return 0;
}
運行結果姿昌:
『柒』 C語言建立帶頭結點的單鏈表
單鏈表的生成有2種方式:頭插法和尾插法。
1、頭插法
/*********************************************************************
*函數名稱:linklist*CreateLinklistHead()
*函數功能:利用頭插法創建鏈表
*參數:無
*返回值:創建完鏈表後的鏈表頭結點
*說明:無
*********************************************************************/
externlinklist*CreateLinklistHead()
{
intx,i,nodeNum;
linklist*head,*temp;//頭結點與臨時結點
head=(linklist*)malloc(sizeof(linklist));//生成表頭結點
head->next=NULL;//給表頭結點的指針域賦值
printf("請輸入鏈表中結點的個數:");
scanf("%d",&nodeNum);
for(i=1;i<=nodeNum;i++)
{
printf("請輸入第%d個結點的數據裂兆:",i);
scanf("%d",&x);
temp=(linklist*)malloc(sizeof(linklist));//生成新的結點
temp->data=x;//對新結點的數據域賦值
//將新結點插到頭結點之後
temp->next=head->next;
head->next=temp;
}
returnhead;//返回新建鏈表的頭結點
}
2、尾插法
/*********************************************************************
*函數名稱:linklist*CreateLinklistRear()
*函數功能:利用尾插法創建鏈表
*參數:無
*返回值:創建完鏈表後的鏈表頭結點
*說明鉛缺:無
*********************************************************************/
externlinklist*CreateLinklistRear()
{
intx,i,nodeNum;
linklist*head,*rear,*temp;//定義頭結點、尾結點和臨時結點
head=(linklist*)malloc(sizeof(linklist));//生成表頭結點,表頭結點不存放數據
head->next=NULL;//將表頭結點的指針域賦值為NULL
rear=head;//將表頭結點賦值給表尾結點
printf("請輸入鏈表中結點的個數:");
scanf("槐源辯%d",&nodeNum);
for(i=1;i<=nodeNum;i++)
{
printf("請輸入第%d個結點的數據:",i);
scanf("%d",&x);
temp=(linklist*)malloc(sizeof(linklist));//生成新的結點
temp->data=x;//新增結點的數據域
temp->next=NULL;//新增結點的指針域(由於是尾插法,所以插入的結點都在尾部,即指針域為NULL)
rear->next=temp;//使前一個結點指向新增結點(head->next=temp)
rear=temp;//將新增結點賦值給尾結點(尾插法,插入的結點在尾部)(rear=head->next)
}
//rear->next=NULL;//將尾結點的指針域賦值為空(為了方便檢驗鏈表是否為空鏈表)
returnhead;//返回頭結點
}
『捌』 C語言創建單鏈表
s* creat_list()函數改下:
s* create_list()
{
int a[]={1,2,3,4,5},j=4;
s *h,*p,*current;
h=(s *)malloc(sizeof(s));
current = h; /*current指針用於跟隨鏈表進度*/
h->next='侍橡\0';
while(j>=0)
{
p=(s *)malloc(sizeof(s));
p->i=a[j];
current->next=p;
current = p;
j--;
}
p ='\0';
current== '\0';
free(p);/*這里把氏談謹用完的空殲基間釋放掉,是個好習慣*/
free(current);
return h;
}
『玖』 c語言用函數創建單鏈表
#include<stdio.h>
#include<stdlib.h>
//鏈表定義
typedef int ElemType;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
/*************************************
* 鏈表函數 *
*************************************/
//鏈表初清運始化
void InitLink(LinkList &L);
//創建函數,尾插法
void CreateLink_T(LinkList &L,int n);
//創建函數,頭插法
void CreateLink_H(LinkList &L,int n);
//銷毀函數
void DestroyLink(LinkList &L);
//判斷是否為空函數
bool EmptyLink(LinkList &L);
//獲取函數
bool GetLink(LinkList &L,int i,int & e);
//答槐梁插入函數
void InsertLink(LinkList &L,int i,int e);
//刪除函數
void DeleteLink(LinkList &L,int i,int &e);
//遍歷函數
void TraverseLink(LinkList &L);
//鏈表長度函數
int LengthLink(LinkList &L);
//合並函數
void MergeLink(LinkList &L1,LinkList L2);
void main()
{
LinkList L1,L2;
InitLink(L1);
InitLink(L2);
CreateLink_H(L1,2);
CreateLink_T(L2,2);
TraverseLink(L1);
printf("\明帆n");
TraverseLink(L2);
printf("\n");
MergeLink(L1,L2);
TraverseLink(L1);
TraverseLink(L2);
}
//創建函數,尾插法
void InitLink(LinkList &L)
{
L=(LinkList)malloc(sizeof(LNode));
if (!L)
{
printf("Init error\n");
return;
}
L->next=NULL;
}
void CreateLink_T(LinkList &L,int n)
{
if(n<1)
{
printf("n must >=1\n");
return ;
}
else
{
// L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
for(int i=0;i<n;i++)
{
LinkList p=(LinkList)malloc(sizeof(LNode));// the lower letter p
printf("enter the data :\t");
scanf("%d",&(p->data));
p->next=L->next;
L->next=p;
}
}
}
//創建函數,頭插法
void CreateLink_H(LinkList &L,int n)
{
if (n<1)
{
printf("n must >=1\n ");
return;
}
else
{
//L=(LinkList)malloc(sizeof(LNode));
LinkList pre=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
pre=L;
for(int i=0;i<n;i++)
{
LinkList p=(LinkList)malloc(sizeof(LNode));
printf("enter the data:\t");
scanf("%d",&(p->data));
pre->next=p;
pre=p;
}
pre->next=NULL;
}
}
//銷毀函數
void DestroyLink(LinkList &L)
{
LinkList q=L,p=L;
while (p)
{
q=p;
p=p->next;
free(q);
}
L->next=NULL;
}
//判斷是否為空函數
bool EmptyLink(LinkList &L)
{
if (NULL==L->next)
{
return true;
}
else
{
return false;
}
}
//獲取函數
bool GetLink(LinkList &L,int i,int& e)
{
if (i<1)
{
return false;
}
else
{
if (EmptyLink(L))
{
return false;
}
LinkList p=L->next;
int j=1;
while(p&&j<i)
{
p=p->next;
j++;
}
if (!p||j>i)
{
return false;
}
else
{
e=p->data;
return true;
}
}
}
//插入函數
void InsertLink(LinkList &L,int i,int e)
{
if (i<0||i>LengthLink(L))
{
printf("Insert error\n");
return;
}
else
{
LinkList p=L;
int j=0;
while(p&&(j<i))
{
p=p->next;
j++;
}
if (!p||j>i)
{
printf("Insert error\n");
return;
}
else
{
LinkList q=(LinkList)malloc(sizeof(LNode));
q->data=e;
q->next=p->next;
p->next=q;
}
}
}
//刪除函數
void DeleteLink(LinkList &L,int i,int &e)
{
if(i<=0||i>LengthLink(L))
{
printf("delete error\n");
return;
}
else
{
LinkList p=L;
int j=0;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i)
{
printf("please enter i again\n");
return;
}
else
{
LinkList q=p->next;
e=p->next->data;
p->next=p->next->next;
free(q);
}
}
}
//遍歷函數
void TraverseLink(LinkList &L)
{
LinkList p=L->next;
if(!p)
{
printf("the Link L is empty\n");
}
while(p)
{
printf("%d\n",p->data);
p=p->next;
}
}
//鏈表長度函數
int LengthLink(LinkList &L)
{
int i=0;
LinkList p=L->next;
while(p)
{
p=p->next;
i++;
}
return i;
}
//合並函數
void MergeLink(LinkList &L1,LinkList L2)
{
int i=0,flag=0;
LinkList p1=L1->next,p2=L2->next;
LinkList p=(LinkList)malloc ((LengthLink(L1)+LengthLink(L2)+2)*sizeof(LNode));
LinkList pre=p;
if (!p)
{
printf("MergeLink error\n");
return;
}
p->next=NULL;
while (p1&&p2)
{
if (p1->data>=p2->data)
{
InsertLink(p,i++,p2->data);
p2=p2->next;
}
else
{
InsertLink(p,i++,p1->data);
p1=p1->next;
}
}
while (p1)
{
InsertLink(p,i++,p1->data);
p1=p1->next;
}
while(p2)
{
InsertLink(p,i++,p2->data);
p2=p2->next;
}
while(pre)
{
pre=pre->next;
}
LinkList q=L1;
L1=p;
DestroyLink(q);
DestroyLink(L2);
}
『拾』 建立單鏈表 用C語言方式
首先,你真的確定你知道什麼是鏈表,什麼是順序表?好了,算了就按題中的順序表來寫嘍(不過,我真的建議你,如果你真不清楚,請把它弄清楚,返塌閉ok?)程序代碼:(看上去有點多,其實演算法很簡單的)#include<stdlib.h>
#include<stdio.h>
#include<conio.h>#define LIST_INT_SIZE 1000
#define ERROR 0
#define OK 1typedef struct {
int *elem;
int length;
int listsize;
}ListSq;typedef int Status;Status Initlist_sq(ListSq *l){
//初始化順序表
l->elem=(int *)malloc(LIST_INT_SIZE*sizeof(int));
if(!l->elem) exit(ERROR);
l->length =0;
l->listsize=LIST_INT_SIZE;
return OK;
}Status InputList_sq(ListSq *l,int length){
//對順序表進行輸入,輸入的長度為:length
//length的區間為[1,1000]
int i;
if(length >1000 ||length<1) exit(ERROR);
printf("please input the data:\n");
for(i=0;i<length;i++){
scanf("%d",l->elem+i);
l->length++;
}
return OK;
}Status OutputList_sq(ListSq *l){
//把順序表輸出
int *p;
for(p=l->elem;p<=&(l->elem[l->length-1]);p++)
printf("%d ",*p);
return OK;
}Status ListDelete_sq(ListSq *l,int i){
//刪除順序表中漏裂位序為i的元素
//注意i的取值范圍!
int *p,*pe;
if(i<1 || i>1000) exit(ERROR);
p=&(l->elem[i+1]);
pe=&(l->elem[l->length-1]);
while(p<=pe){
*(p-1)=*p;
p++;
}
l->length--;
return OK;
}Status ConvertList_sq(ListSq *l){
//這個操作就是執行衫穗你題目要求的那玩意
int i,j,k;
for(i=0;i<l->length;i++){
k=i;
for(j=0;j<i;j++)
if(l->elem[i]==l->elem[j])
ListDelete_sq(l,i);
}
return OK;
}
int main(void)
{
ListSq list;
int length,status;
printf("Creat a new SQlist:\n");
status=Initlist_sq(&list);
if(!status)
{
printf("\aWarning:Failed to Creat the List\n");
getch();
exit(ERROR);
}
else {
printf("succeed to creat!\n");
printf("******** status of the list *********\n");
printf("the length is %d\nthe listsize is %d\n",list.length,list.listsize);
}
printf("Now you could input the data for the list:\n");
printf("How many datas do you want to input:");scanf("%d",&length);
InputList_sq(&list,length);
OutputList_sq(&list);
printf("\nthe result of converting list:");
ConvertList_sq(&list);
OutputList_sq(&list);
putchar('\n');
return 0;
}一下是運行結果: 好了,完成任務了。。。演算法不難,認真思考就搞定,望樓主堅持下去,不斷努力!
對了,要是程序上有什麼不懂得,hi我就可以了