一 鍊錶的概述
鍊錶是一種常見的重要的資料結構。它是動態地進行儲存分配的一種結構。它可以根據需要開闢記憶體單元。鍊錶有乙個「
頭指標」
變數,以
head
表示,它存放乙個位址。該位址指向乙個元素。鍊錶中每乙個元素稱為「結點
」head
指向第乙個元素:第乙個元素又指向第二個元素;
……,直到最後乙個元素,該元素不再指向其它元素,它稱為「表尾
」,它的位址部分放乙個
「null」
(表示「
空位址」
),鍊錶到此結束。
1.單向鍊錶
單向鍊錶的每個結點中除資訊域以外還有乙個指標域,用來指出其後續結點,單向鍊錶的最後乙個結點的指標域為空(null)
。單向鍊錶由頭指標唯一確定,因此單向鍊錶可以用頭指標的名字來命名,例如頭指標名為
head
的單向鍊錶稱為表
head
,頭指標指向單向鍊錶的第乙個結點。簡單實現為:
struct node ;
2.雙向鍊錶
每個結點中只包括乙個指向下個結點的指標域,這種鍊錶稱為單向鍊錶。如果要在單向鍊錶乙個指標所指的當前位置插入乙個新結點,就必須從煉表頭指標開始逐個遍歷直到當前指標所指結點的前一結點,修改這個結點的指標。雙向鍊錶的每個結點中包括兩個指標域,分別指向該結點的前乙個結點和後乙個結點。在雙向鍊錶中由任何乙個結點都很容易找到其前面的結點和後面的結點,而不需要在上述的插入(
及刪除)
操作中由頭結點開始尋找。簡單實現為:
struct node ;
3.迴圈鍊錶
單向鍊錶的最後乙個結點的指標域為空(
null
)。如果將這個指標裡利用起來,以指向單向鍊錶的第乙個結點,就組成乙個單向迴圈鍊錶。
二:簡單鍊錶(靜態鍊錶)
#include
#define null 0
struct student
long num;
float score;
struct student *next;
void main()
本例所有結點都是在程式中定義的,不是臨時開闢的嗎,也不能用完後釋放,這種鍊錶成為「靜態鍊錶」。
三 動態鍊錶的建立、輸出、刪除、插入
動態鍊錶指在程式執行過程中從無到有地建立起乙個鍊錶,即乙個乙個地開闢結點和輸入結點資料,並建立起前後相鏈的關係。
1、建立乙個有3名學生資料的單向動態鍊錶。
2、輸出鍊錶
3、鍊錶的刪除
4、鍊錶的插入
源**:
#include
#include
#include
#define len sizeof(struct student)
struct student
int num;
float score;
struct student *next;
int n;//定義全域性變數
void main()
//宣告函式
struct student *creat();
void print(struct student *head);
struct student *del(struct student *head,int num);
struct student *insert(struct student *head,struct student *stud);
//定義結構體指標變數和其他變數
struct student *head,*stu;
int del_num;
//建立鍊錶
head=creat();
print(head);
//刪除資料
printf("\nplease enter the num to delete:");
scanf("%d",&del_num);
while(del_num)
head=del(head,del_num);
print(head);
printf("\nplease input the num to delete:");
scanf("%d",&del_num);
//插入資料
stu=(struct student *)malloc(len);
printf("\nplease input the num to insert:");
scanf("%ld",&stu->num);
printf("please input the score to insert:");
scanf("%f",&stu->score);
while(stu->num)
head=insert(head,stu);
print(head);
printf("\nplease input the num to insert:");
scanf("%ld",&stu->num);
printf("please input the score to insert:");
scanf("%f",&stu->score);
printf("\n\n");
system("pause");
//建立鍊錶
struct student *creat()
struct student *head,*p1,*p2;
p1=p2=(struct student *)malloc(len);
printf("please enter the num:");
scanf("%ld",&p1->num);
printf("please enter the score:");
scanf("%f",&p1->score);
head=null;
n=0;
while(p1->num)
n++;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=(struct student *)malloc(len);
printf("please enter the num:");
scanf("%d",&p1->num);
printf("please enter the score:");
scanf("%f",&p1->score);
p2->next=null;
return head;
//輸出鍊錶
void print(struct student * head)
struct student *p;
printf("\nnow,there %d records are:\n",n);
p=head;
if(head)
doprintf("學號為%ld的成績是:%5.1f\n",p->num,p->score);
p=p->next;
}while(p);
//刪除鍊錶
struct student *del(struct student *head,int num)
struct student *p1,*p2;
if(head==null)
printf("\nthis list is null!\n");
return head;
p1=head;
while(p1->num!=num && p1->next!=null)
p2=p1;
p1=p1->next;
if(num==p1->num)
if(p1==head) head=p1->next;
else p2->next=p1->next;
printf("delete no:%d succeed!\n",num);
n=n-1;
else
printf("%d not been found!\n",num);
return head;
//插入資料
struct student *insert(struct student *head,struct student *stud)
struct student *p0,*p1,*p2;
p1=head;
p0=stud;
if(head==null)
head=p0;
p0->next=null;
else
while((p0->num > p1->num)&&(p1->next!=null))
p2=p1;p1=p1->next;
if(p0->num<=p1->num)
if(p1==head) head=p0;
else p2->next=p0;
p0->next=p1;
else
p1->next=p0;p0->next=null;
n=n+1;
return head;
c語言 鍊錶 C語言鍊錶例項 玩轉鍊錶
下圖為最一簡單鍊錶的示意圖 第 0 個結點稱為頭結點,它存放有第乙個結點的首位址,它沒有資料,只是乙個指標變數。以下的每個結點都分為兩個域,乙個是資料域,存放各種實際的資料,如學號 num,姓名 name,性別 和成績 score 等。另乙個域為指標域,存放下一結點的首位址。鍊錶中的每乙個結點都是同...
c語言鍊錶 鍊錶
在儲存一大波數的時候,我們通常使用陣列,但有時候陣列顯得不夠靈活,比如有一串已經從小到大排序好的數 2 3 5 8 9 10 18 26 32 現在需要往這串數中插入6使其得到的新序列仍符合從小到大排列。如果我們使用陣列來實現這一操作,則需要將8和8後面的數字都依次往後挪一位,如果你覺得這幾個數不算...
c語言 鍊錶 C語言之鍊錶入門
鍊錶三要素 1 頭指標 head 是用來說明鍊錶開始了,頭指標就代表鍊錶本身 所以以後要訪問鍊錶,就要訪問頭指標 2 結點 node 鍊錶中每乙個結構體變數 3 尾指標 用來說明鍊錶的結束 它是乙個空指標,null include includetypedef struct stud 定義了乙個結構...