參考自:http://data.biancheng.net/view/5.html
如何創建鏈表
首先創建一個結構體表示節點:
typedef struct Link{ int elem; struct Link *next; }link;
接下來編寫初始化函數。由一維數組初始化鏈表。
link * initLink(int *num,int length){ link * p=(link*)malloc(sizeof(link));//創建一個頭結點 link * temp=p;//聲明一個指針指向頭結點,用於遍歷鏈表 //生成鏈表 for (int i=0; i<length; i++) { link *a=(link*)malloc(sizeof(link)); a->elem=num[i]; a->next=NULL; temp->next=a; temp=temp->next; } return p; }
在每次循環中,首先將值賦給當前節點,將當前節點的指針指向NULL,然後移動一位,到下一個節點。依次賦值,直到完成,於是最後一個節點的next域保持NULL。
插入小tip:通過傳遞數組名或數組指針參數到子函數中,以獲得數組長度是不可行的。因爲num是函數參數,到了本函數中,只是一個指針(地址,系統在本函數運行時,是不知道其所表示的地址有多大的數據存儲空間,這裏只是告訴函數一個數據存儲空間首地址)。
而在數組定義所在的代碼區中就可以使用以下方法獲取數組大小。
double num[] = {1,2,3,4}; int length; length=sizeof(num)/sizeof(num[0]);
接下來定義遍歷所有元素輸出鏈接的函數。只要temp指針指向的結點的next不是Null,就執行輸出語句,否則跳出循環。
void display(link *p){ link* temp=p;//將temp指針重新指向頭結點 while (temp->next) { temp=temp->next; printf("%d -> ",temp->elem); } printf("NULL\n"); }
測試如下:
int main() { int a[6] = {10,5,3,2,1,6}; link *p=initLink(a,6); display(p); return 0; }
如何插入新節點
鏈表插入的函數,p是鏈表,elem是插入的結點的數據域,add是插入的位置。
link * insertElem(link * p,int elem,int add){ link * temp=p;//創建臨時結點temp //首先找到要插入位置的上一個結點 for (int i=1; i<add; i++) { if (temp==NULL) { printf("插入位置無效\n"); return p; } temp=temp->next; } //創建插入結點c link * c=(link*)malloc(sizeof(link)); c->elem=elem; //向鏈表中插入結點 c->next=temp->next; temp->next=c; return p; }
如何移除節點
刪除結點的函數,p代表操作鏈表,add代表刪除節點的位置。
link * delElem(link * p,int add){ link * temp=p; //遍歷到被刪除結點的上一個結點 for (int i=1; i<add; i++) { temp=temp->next; } link * del=temp->next;//單獨設置一個指針指向被刪除結點,以防丟失 temp->next=temp->next->next;//刪除某個結點的方法就是更改前一個結點的指針域 free(del);//手動釋放該結點,防止內存泄漏 return p; }
查找節點元素
查找結點的函數,elem爲目標結點的數據域的值,返回找到的位置。
int selectElem(link * p,int elem){ link * temp=p; int i=1; while (temp->next) { temp=temp->next; if (temp->elem==elem) { return i; } i++; } return -1; }
測試:
int main() { int a[6] = {10,5,3,2,1,6}; link *p=initLink(a,6); display(p); printf("在第4的位置插入元素5:\n"); p=insertElem(p, 5, 4); display(p); printf("刪除第2位置的元素:\n"); p=delElem(p, 2); display(p); printf("查找元素2的位置爲:\n"); int address=selectElem(p, 2); if (address==-1) { printf("沒有該元素\n"); }else{ printf("元素2的位置爲:%d\n",address); } return 0; }