學過線性表中的順序表的都知道,順序表裡的資料在物理記憶體上是相鄰的,所以當我們在順序表中想要訪問下乙個元素時可以直接去訪問,就像陣列一樣。但是單鏈表卻不同,單鏈表的資料儲存的位置是動態分配的,也就是說單鏈表的儲存在物理記憶體上不是相鄰的,所以我們就只能通過指標這種方式來把單鏈表串起來,通過指標來訪問下乙個結點。
單鏈表的結點裡有資料域和指標域,資料域是用來儲存資料的,指標域是用來儲存直接後繼結點的域。
typedef struct nodelinklist,*link;這裡我建立的是帶頭頭結點的單鏈表,頭結點裡並不儲存你輸入的資料,但可以儲存一些例如表長的資料,同時頭結點的next指標指向下乙個首元結點也就是第乙個開始儲存資料的結點,單鏈表結構如下圖:
在我們建立頭結點的同時會用乙個結點了來指向頭結點也就是頭指標,這個頭指標對於整個鍊錶來說是非常重要的,因為我們每次想要來遍歷鍊錶中的資料時必須要先找到頭指標然後才能乙個乙個往下找到所有的資料,所以我們不能把單鏈表的頭結點丟了。還有鍊錶的最後乙個結點的指標要指向空,也可以指向頭結點,指向頭結點之後鍊錶也就成了迴圈鍊錶,當我們把最後乙個結點的指標指向空時,我們就可以判空值來判斷是不是最後乙個結點。 建立鍊錶的**:
//建立鍊錶
void creastelist(link h)
listlength = i;//鍊錶的長度
p->next = null; //最後結束輸入後p指向的是最後乙個結點,將最後乙個結點的next指向空
}但因單鏈表我們只需要讓頭指標的副本p不斷的指向下乙個結點,遍歷了整個鍊錶,結束條件就是尾結點的next為null。
//列印鍊錶
void printlist(link h)
printf("\n");
}要刪除乙個單鏈表中的乙個元素不需要像順序表那樣把刪除位置的後面的資料都前移乙個位置,只需要改變一下指標的指向就可以了。
所以相比順序表,單鏈表的刪除操作的時間複雜度要低很多。 **如下:
//刪除鍊錶
void deletelist(link h,int i)
delep = p->next;//此時的p指向需要刪除的結點的前乙個結點,delep指向需要刪除的結點
p->next = delep->next;//將p的next指向delep的next指向的結點,例如上圖將2的next指標指向4
free(delep);
printf("刪除成功!\n");
listlength--;//刪除成功後鍊錶長度減1
}}同樣的單鏈表的插入操作要比順序表的時間複雜度低很多,單鏈表插入時不需要把所有元素後移,只需要改變指標的指向。
**如下:
//插入鍊錶
void insertlist(link h,int i)
cnew->next = p->next;//將新結點的next指向p->next,即如上圖將p的next指向4
p->next = cnew;//然後將p的next指向新結點
printf("插入成功!");
listlength++;//插入成功後鍊錶長度加1
}}查詢時只需將查詢的資料和鍊錶的每乙個資料進行配對,配對成功時返回此時的資料位置。// 查詢元素
int findlist(link h,int s)
if(i>listlength||p->data!=s) return 0;//如果i的值大於了鍊錶的長度或者此時的p->data不是s,那麼就是鍊錶中沒有和s配對成功的結點
else return i;//配對成功返回此時的結點的位置
}#include
#include
int listlength = 0;//鍊錶長度
typedef struct nodelinklist,*link;
void creastelist(link h);//建立鍊錶
void insertlist(link h,int i);//插入鍊錶,i為插入位置
void deletelist(link h,int i);//刪除,i為刪除的位置
int findlist(link h,int s);//查詢,i為查詢的資料,查詢鍊錶中是否有這個資料
void printlist(link h);//列印鍊錶
int getlistlength(link h);//獲取鍊錶長度
void sortinsert(link h,int s);//有序插入
int main()
//建立鍊錶
void creastelist(link h)
listlength = i;
p->next = null;
}//列印鍊錶
void printlist(link h)
printf("\n");
}//獲取鍊錶長度
int getlistlength(link h)
return length;
}//刪除鍊錶
void deletelist(link h,int i)
delep = p->next;
p->next = delep->next;
free(delep);
printf("刪除成功!\n");
listlength--;
}} //有序插入
void sorteninsert(link h,int s)
if(p->next==null)else
listlength++;
} //插入鍊錶
void insertlist(link h,int i)
cnew->next = p->next;
p->next = cnew;
printf("插入成功!");
listlength++; }}
// 查詢元素
int findlist(link h,int s)
if(i>listlength||p->data!=s) return 0;
else return i;
}
C語言單鏈表
include include include define error 0 typedef struct lnode lnode,linklist linklist initlist linklist l node next null l node return l int listlength ...
c語言 單鏈表
單鏈表,顧名思義是一種鏈式訪問的資料結構,用一組位址任意的儲存單元存放線性表中的資料元素。鍊錶中的資料是以結點來表示的,每個結點的構成 元素 資料元素的映象 指標 指示後繼元素儲存位置 元素就是儲存資料的儲存單元,指標就是連線每個結點的位址資料。我們在這裡使用c語言實現 h 檔案 pragma on...
C語言單鏈表
學過線性表中的順序表的都知道,順序表裡的資料在物理記憶體上是相鄰的,所以當我們在順序表中想要訪問下乙個元素時可以直接去訪問,就像陣列一樣。但是單鏈表卻不同,單鏈表的資料儲存的位置是動態分配的,也就是說單鏈表的儲存在物理記憶體上不是相鄰的,所以我們就只能通過指標這種方式來把單鏈表串起來,通過指標來訪問...