鍊錶是實現表結構的一種實現方式,鍊錶允許資料節點在記憶體中不連續儲存,從而避免了線性表在插入和刪除操作中表的部分或者全部需要整體移動的線性開銷。鍊錶由一系列在記憶體中不連續的存在的結構組成,結構見圖1,每個結構均含有表元素和指向包含該元素後繼元的結構的指標,一般稱之為next指標,鍊錶最後乙個元素的next指標指向null。
本文**基於mark allen weiss編著的資料結構和演算法分析一書,編譯平台為visual studio 2013。
鍊錶的各類操作包括建立鍊錶、判斷鍊錶是否為空、刪除鍊錶、插入鍊錶、輸出鍊錶、排序、反序等。
我們首先從定義鍊錶結構開始,其中我們定義了name為學生的結構體,ptrtonode是乙個指向結構體節點的指標,同理position和linkedlist,該定義只是為了更加清晰地表示其代表的含義。
struct student;
typedef struct student *ptrtonode; //ptrtonode is the pointer of the linkedlist
typedef ptrtonode position;
typedef ptrtonode linkedlist;
struct student
;
建立鍊錶:我們建立的鍊錶結構沒有頭結點,程式中head是表頭位置,p2是倒數第乙個結構的指標,p1用來獲取輸入端的資訊。
position createnode(void)
else
while (p1->num != 0)//我們把輸入的num為0作為輸入結束的標誌
else
p2 = p1;//此處是和p2->next = null;一起作用的
p1 = (position)malloc(len); //開拓記憶體單元
printf("please input the %d node's number:", n + 1);
scanf("%d %f", &(p1->num));
} p2->next = null; //加上尾指標
free(p1); //釋放p1記憶體單元
p1 = null;
return head;
}
為了能夠更好地觀察到我們的輸入資料是否被正確地識別並儲存在鍊錶中,我們設計乙個列印程式print來對鍊錶元素進行輸出。
void print(position head)
while (p != null);
} }
void printreverse(position head)
else
printf("%d\n", p->num);
} }
判斷鍊錶是否為空和將鍊錶清空的**。
linkedlist makeempty(linkedlist l)
int isempty(linkedlist l)
void deletelinkedlist(linkedlist l)
}
比較重要的鍊錶操作——刪除position deletenode(int x, linkedlist l),鍊錶的刪除操作首先需要找到刪除節點前乙個節點的位置,將該節點的指標指向刪除節點的下乙個節點即可,需要注意的是如果刪除的節點是表頭的話,將表頭的指標指向下一節點即可。
position deletenode(int x, linkedlist l)
p2 = findprevious(x, l);
p1 = p2->next;
//p1 = p1->next;
if (p1->num == x)
else
free(p1);
p1 = null;
} return l;
} position findprevious(int x, linkedlist l)
return p;
}
以及插入操作——void insert(int x, linkedlist l, position p),插入操作的只需要將插入位置前一節點的指標指向當前節點,當前節點的指標指向後一節點即可。
void insert(int x, linkedlist l, position p)
相應的還有查詢。
position find(int x, linkedlist l)
return p;
}
排序, 此處排序使用的是簡單的氣泡排序,之後會有一篇文詳細介紹和比較各種排序演算法的原理和效率。
position bubblesortlist(linkedlist l)
} }
p1 = l;
l = l->next;
free(p1);
p1 = null;
return l;
}
當然還有非常鬧心的反轉,個人在實現反轉**時,發現反轉的邏輯非常彆扭,先貼**。p1是反序鍊錶的表頭,p2是未反序鍊錶的表頭,p作為中間變數儲存未反序的鍊錶的表頭。
position reverse(linkedlist l)
l = p1;
return l;
}
接下來用詭異的大圖來分析一下反轉是如何實現的。第一次反轉,a1節點成為了鍊錶的表尾節點,p2是未反序鍊錶的表頭。
第二次反轉,相信大家根據while迴圈中的四行**能把結果推出來。
鍊錶基本操作實現 c語言
include include typedef int elemtype typedef struct node linklist,linknode 鍊錶初始化 linklist initlinklist head next null printf 鍊錶初始化成功 n return head 頭插法...
C語言的指標 鍊錶的原理和各類操作
一 指標 1 運用指標 什麼是指標?什麼是記憶體位址?什麼叫做指標的取值?指標是乙個儲存計算機記憶體位址的變數。從指標指向的記憶體讀取資料稱作指標的取值。指標可以指向某些具體型別的變數位址,例如int long和double。指標也可以是void型別 null指標和未初始化指標。根據出現的位置不同,...
C語言的指標 鍊錶的原理和各類操作
一 指標 1 運用指標 什麼是指標?什麼是記憶體位址?什麼叫做指標的取值?指標是乙個儲存計算機記憶體位址的變數。從指標指向的記憶體讀取資料稱作指標的取值。指標可以指向某些具體型別的變數位址,例如int long和double。指標也可以是void型別 null指標和未初始化指標。根據出現的位置不同,...