作為幾乎是初學c語言的人,在指標的問題還沒有完全搞明白的時候,就看到了資料結構裡面鍊錶這樣乙個龐然大物,完全不懂的怎麼操作。在閱讀了多方資料後,終於根據自己的理解,寫出了第乙個單向鍊錶程式,放在此處與大家分享,也讓自己在複習的時候可以再回顧一下。
程式實現了鍊錶的建立、新增單個元素、刪除單個元素的功能;物件為單個int型,即程式中的data。
因為都是用的函式,所以如果要新增其他的操作,只需要寫另外的函式就可以了。
下面點明幾個個人感覺比較重要的思想。
一、找到前乙個元素
想要處理某個元素的時候,要用指標指向該元素(方法是遍歷搜尋),但同時,如果要執行新增或刪除元素的操作,要用另外乙個指標找到被處理元素之前的乙個元素,這樣才能讓鍊錶中的指標連線起來,因為鍊錶的核心就是上乙個指向下乙個,下乙個再指向下乙個。舉個例子,在刪除元素的時候,要讓被刪除元素的上乙個元素的指標,指向被刪除元素指向的元素,所以在操作上需要找到被刪除元素的上乙個元素;新增同樣是如此,要讓上乙個元素指向新新增的元素。
在迴圈建立元素的過程中,用了乙個*current指標指向被建立元素的之前乙個元素,其作用是解決下面所述的乙個問題:
建立頭部之後進入迴圈,建立第乙個元素s1後,要把頭部的指標指向第乙個元素s1,即 head->next = s1;建立第二個元素s2後,要讓s1指向s2,即 s1->next = s2;但在迴圈中,因為s1和s2並不是陣列,所以並不能實現這樣換元素的操作,自然而然,程式中用了*current來解決這個問題。
進入迴圈之前建立*current,代表當前建立元素的前乙個元素,具體實現方法:
1、頭:current = head;(為了之後建立s1後,對head的指標進行操作;因為current也是指標,所以操作current就等於操作head);
2、建立第乙個元素s1後:current->next = s1;(剛建立的元素,利用current對head操作,使head指向s1);
current = s1;(因為接下來要建立s2了,為了建立s2後,對s1的指標進行操作
(使s1的指標指向s2),所以把s1的值賦給current,等下對current進行操作,就相當於操作s1);
3、建立第二個元素s2後:current->next = s2(此處的current即s1,實現了s1->next = s2);
current = s2;(再為接下來建立新的元素做準備);
n、建立最後乙個元素sn:current->next = null;(最後乙個指標指向null,鍊錶結束)。
雖然上面寫了s1,s2,看起來像是分開的,但在鍊錶中,每乙個元素都是*next,所以其實是一樣的東西,在迴圈中並沒有s1,s2之分,都是*next。
二、首位插入
本人解決首位插入的問題的方法很簡單,可能也比較笨,其實就是把新建立的元素先放在head和第二個元素之間,再交換該元素與頭元素的data資料。
1、新建立元素s1
2、s1插入到head後(與在鍊錶中間插入無異,即listinsert函式)
s1->next = head->next;
head->next = s1;
3、交換s1和head的data
s1->data = head->data;
head->data = new data;
即實現把新加入的data放在頭尾,head中的data放在第二位。
下面上程式:
#include #include struct cell ;
struct cell * listcreate()
head->data = value;
//current的作用在筆記上
current = head;
printf("是否要繼續新增?(y/n)\n");
scanf("%c", &flag);
getchar();
while(flag != 'n' && flag != 'n')
next->data = value;
current->next = next;
current = next;
printf("是否要繼續新增?(y/n)\n");
scanf("%c", &flag);
}current->next = null;
return head;
}//head把原函式中的頭傳進來作尋找用
void listinsert(struct cell *head)
else
//新節點賦值
next->data = value;
//找到鍊錶的頭
p = head;
//用值從頭尋找插入元素之前那個元素的值
while(p->data != front)
p = p->next;
//新插入的元素的指標指向下乙個元素,即等於前乙個元素的指標
next->next = p->next;
//前乙個元素的指標指向該新插入的元素
p->next = next;
}}void listdelete(struct cell *head)
//p前一元素front指標指向原來p指向的下乙個元素
front->next = p->next;
free(p);
}void listviewall(struct cell *p)
printf("%d\n", p->data);
}int main()
}return 0;
}
程式沒有糾錯,希望大家輸入的時候謹慎小心。 C語言單向鍊錶實現
include include typedef struct node listnode typedef listnode linklist 帶頭節點的單鏈表 初始化單鏈表只有頭節點 void initlinklist linklist linklist 建立乙個單鏈表 linklist creat...
C語言單向鍊錶的實現
乙個簡單結點的結構體表示為 struct note int data 資料成員可以是多個不同型別的資料 struct note next 指標變數成員只能是 個 乙個簡單的單向鍊錶的圖示 1 鍊錶是結構 指標相結合的 種應用,它是由頭 中間 尾多個鏈環組成的單方向可伸縮的鍊錶,鍊錶上的鏈環我們稱之為...
C語言單向鍊錶的實現
偶然間想起了n年前的乙個c語言的面試題目,現在做了乙個總結,完美解答。乙個簡單結點的結構體表示為 struct note 乙個簡單的單向鍊錶的圖示 1 鍊錶是結構 指標相結合的 種應用,它是由頭 中間 尾多個鏈環組成的單方向可伸縮的鍊錶,鍊錶上的鏈環我們稱之為結點。2 每個結點的資料可用 個結構體表...