當前位置:首頁 » 編程語言 » c語言鏈表例子
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言鏈表例子

發布時間: 2022-12-06 21:21:24

① 用c語言寫一個簡單的鏈表,具體要怎麼用代碼實現

可以用結構體和指針來實現
定義:
定義一個單個元素的結構

typedef struct Chain_tag { // 這里用typedef來定義,方便使用 int data; // 這里的數據可以是任意類型 //其他數據 struct Chain_tag *prev, *next;// 由於Chain為不完全類型,故只能用指針的方式聲明} Chain;

使用:
用單個結構體的指針作為head

#include <malloc.h> //Chain的定義寫在這里 Chain *alloc_single_chain(int data /*, (其他參數)*/){ Chain *tmp; tmp = malloc(sizeof(Chain)); tmp.data = data; //...其餘數據初始化 tmp.prev = tmp.next = NULL; // 將前後指針置為NULL return tmp;} voiddispose_chain(Chain *target) //其實這里功能簡單,用宏實現也可以{ free(target); return;} int main(){ Chain *head; Chain *pos; head = alloc_single_chain(10);//初始化起始結點 head->next = alloc_single_chain(11);//同理。。下一個結點 for (pos = head; pos; pos = pos->next)//清理垃圾好習慣 { dispose_chain(pos); } return 0;}

② C語言創建鏈表,函數調用部分


#include<stdio.h>
#include<windows.h>
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

//定義數據類型名稱
typedef int DataType;

#define flag -1 //定義數據輸入結束的標志數據

//單鏈表結點存儲結構定義
typedef struct Node
{
DataType data;
struct Node *next;
}LNode ,*LinkList;

//建立單鏈表子函數
LNode *Create_LinkList()
{
LNode *s,*head,*L;int i=0,x; //定義指向當前插入元素的指針
while(1)
{
scanf("%d",&x);
if(-1==x)
{ return head;
break;}
s= (LNode *)malloc(sizeof(LNode)); //為當前插入元素的指針分配地址空間
s->data =x;
s->next =NULL;
i++;
if(i==1)
head=s;
else
L->next =s;
L=s;

}
}
//查找子函數(按序號查找)
LNode *Get_LinkList(LinkList L,int i)
{
LNode *p;
int j; //j是計數器,用來判斷當前的結點是否是第i個結點
p=L;
j=1;
while(p!=NULL&&j<i)
{
p=p->next ; //當前結點p不是第i個且p非空,則p移向下一個結點
j++;
}
return p;
}

//插入運運算元函數
void Insert_LinkList(LinkList L,int i,DataType x) //在單鏈表L中第i個位置插入值為x的新結點
{
LNode *p,*s;
p =Get_LinkList(L,i); //尋找鏈表的第i-1個位置結點
if(p==NULL)
{
printf("插入位置不合法!");
exit(-1);
}
else
{
s= (LinkList)malloc(sizeof(LNode)); //為當前插入元素的指針分配地址空間
s->data =x;
s->next =p->next ;
p->next =s;
}
}

//單鏈表的刪除運運算元函數
void Delete_LinkList(LinkList L,int i) //刪除單鏈表上的第i個結點
{
LNode *p,*q;
p=Get_LinkList(L,i-1); //尋找鏈表的第i-1個位置結點
if(p==NULL)
{
printf("刪除的位置不合法!"); //第i個結點的前驅結點不存在,不能執行刪除操作
exit(-1);
}
else
{
if(p->next ==NULL)
{
printf("刪除的位置不合法!"); //第i個結點不存在,不能執行刪除操作
exit(-1);
}

else
{
q=p->next ;
p->next =p->next->next;
free(q);
}
}
}

//求表長運運算元函數
int Length_LinkList(LinkList L)
{
int l; //l記錄L的表長
LNode *p;
p=L;
l=1;
while(p->next)
{
p=p->next;
l++;
}
return l;
}
int main ()
{
LNode *head,*p;
head=(LinkList)malloc(sizeof(LNode));
int x,y;
a:
printf("*******menu******* ");
printf("**創建**********1* ");
printf("**插入**********2* ");
printf("**刪除**********3* ");
printf("**表長**********4* ");
printf("**清屏**********5* ");
printf("**列印**********6* ");
printf("**退出******other* ");
printf("****************** ");
int i=1;
while(i)
{
printf("請輸入選項:");
scanf("%d",&i);
switch(i)
{
case 1:head=Create_LinkList(); getchar();break;
case 2:printf("請輸入位置和數據;");
scanf("%d%d",&x,&y);
Insert_LinkList(head,x,y);break;
case 3:printf("請輸入位置;");
scanf("%d",&x);
Delete_LinkList(head,x);break;
case 4:printf("%d",Length_LinkList(head));break;
case 5:system("cls");goto a;
case 6:p=head;
while(p!=NULL)
{printf("%d ",p->data);
p=p->next;}
break;
default :i=0;
}
}
}

我把創建給改了一下

③ 求寫C語言 創建鏈表實例子。要最基本的 包括注釋。

題目:創建固定長度的單向鏈表


程序分析:鏈表是動態分配存儲空間的鏈式存儲結構,

其包括一個「頭指針」變數,其中第0個結點稱為整個鏈表的頭結點,頭結點中存放一個地址,該地址指向一個元素,頭結點一般不存放具體數據,只是存放第一個結點的地址。

鏈表中每一個元素稱為「結點」,每個結點都由兩部分組成:存放數據元素的數據域和存儲直接後繼存儲位置的指針域。指針域中存儲的即是鏈表的下一個結點存儲位置,是一個指針。多個結點鏈接成一個鏈表。

最後一個結點的指針域設置為空(NULL),作為鏈表的結束標志,表示它沒有後繼結點。


使用結構體變數作為鏈表中的結點,因為結構體變數成員可以是數值類型,字元類型,數組類型,也可以是指針類型,這樣就可以使用指針類型成員來存放下一個結點的地址,使其它類型成員存放數據信息。


在創建列表時要動態為鏈表分配空間,C語言的庫函數提供了幾種函數實現動態開辟存儲單元。

malloc()函數實現動態開辟存儲單元:

malloc函數原型為:void *malloc(unsigned int size);
其作用是在內存的動態存儲區中分配一個長度為size的連續空間,函數返回值是一個指向分配域起始地址的指針(類型為void)。如果分配空間失敗(如,內存空間不足),則返回空間指針(NULL)

#include<stdio.h>
#include<malloc.h>
structLNode
{
intdata;
structLNode*next;
};
/*上面只是定義了一個結構體類型,並未實際分配內存空間
只有定義了變數才分配內存空間*/
structLNode*creat(intn)
{
inti;
structLNode*head,*p1,*p2;
/*head用來標記鏈表,p1總是用來指向新分配的內存空間,
p2總是指向尾結點,並通過p2來鏈入新分配的結點*/
inta;
head=NULL;
for(i=1;i<=n;i++)
{
p1=(structLNode*)malloc(sizeof(structLNode));
/*動態分配內存空間,並數據轉換為(structLNode)類型*/
printf("請輸入鏈表中的第%d個數:",i);
scanf("%d",&a);
p1->data=a;
if(head==NULL)/*指定鏈表的頭指針*/
{
head=p1;
p2=p1;
}
else
{
p2->next=p1;
p2=p1;
}
p2->next=NULL;/*尾結點的後繼指針為NULL(空)*/
}
returnhead;/*返回鏈表的頭指針*/
}
voidmain()
{
intn;
structLNode*q;
printf("請輸入鏈表的長度:/n");
scanf("%d",&n);
q=creat(n);/*鏈表的頭指針(head)來標記整個鏈表*/
printf("/n鏈表中的數據:/n");
while(q)/*直到結點q為NULL結束循環*/
{
printf("%d",q->data);/*輸出結點中的值*/
q=q->next;/*指向下一個結點*/
}
}