DS 鍊錶的概念及單鏈表介面的實現及其應用

2021-09-25 12:45:08 字數 3829 閱讀 4140

鍊錶的結構型別可分為:

1,單鏈表,雙向鍊錶

2,不帶頭單鏈表,帶頭鍊錶

3,單鏈表,迴圈單鏈表

鍊錶的實現

一,單鏈表介面的實現

宣告檔案slist.h

slist.h
#ifndef _slist_h_

#define _slist_h_

#include#include#include#include#include#include#include#pragma warning(disable:4996)

typedef int sltdatatype;

typedef struct slistnode

slistnode;

void slistinit(slistnode** pphead);

void slistdestory(slistnode** pphead);

slistnode* buyslistnode(sltdatatype x);

void slistpushfront(slistnode** pphead, sltdatatype x);

void slistpopfront(slistnode** pphead);

slistnode* slistfind(slistnode* phead, sltdatatype x);

void slistinsertafter(slistnode* pos, sltdatatype x);

void slisteraseafter(slistnode* pos);

void slistremove(slistnode** pphead, sltdatatype x);

void slistprint(slistnode* phead);

#endif

實現檔案slist.c

slist.c
#include"slist.h"

void slistinit(slistnode** pphead)//將頭指標進行初始化,所以需要二級指標來接收頭指標的位址,對二級指標解引用(頭指標)將其的data和next都置為null

slistnode* buyslistnode(sltdatatype x)//重新申請乙個新的節點,通過tmp來指向這個節點,將其資料部分賦值為x,next置為空

slistnode* slistfind(slistnode* phead, sltdatatype x)//找到與x相同的數字的位址並返回,需要乙個tmp變數來進行遍歷知道找到和x相同的資料的位址返回 }}

void slistpopfront(slistnode** pphead)//頭刪,由於需要進行頭刪操作所以我們就需要定義乙個二級指標來指向頭phead,定義乙個tmp來儲存頭所指向的目標,再把tmp的位址傳給二級指標pphead

slistnode *tmp = (*pphead)->next;

free(*pphead);

*pphead = tmp;

}void slistpushfront(slistnode** pphead, sltdatatype x)//頭插,首先要申請乙個新的節點,然後讓這個新節點的next指向phead,然後再將pphead指向tmp

void slistinsertafter(slistnode* pos, sltdatatype x)//後插

void slisteraseafter(slistnode* pos)//後刪

pos->next = tmp->next;

free(tmp);

}void slistremove(slistnode** pphead, sltdatatype x)

for (tmp = *pphead; tmp->next; tmp = tmp->next) }

}void slistremoveall(slistnode** pphead, sltdatatype x)

for (tmp = *pphead; tmp&&tmp->next;)

else

}}void slistprint(slistnode* phead)

tmp = null;

}void slistdestory(slistnode** pphead)//從頭結點開始,刪除其後的每乙個節點,直到只剩下頭結點,最後free頭結點

while ((*pphead)->next)

free(*pphead);

*pphead = null;

}

測試檔案main.c

main.c
#include"slist.h"

int main()

二,單鏈表的應用(函式需要在標頭檔案宣告,main函式實現)

1,反轉乙個單鏈表(題目詳情見

//反轉乙個單鏈表

//方法一

void slistreverse(slistnode** pphead)

*pphead = head;//逆轉結束後,將新的頭賦給phead

}//方法二

void _slistreverse(slistnode** pphead)

*pphead = pre;

}

2,輸入兩個鍊錶,找它們的第乙個公共結點(題目詳情見

//兩個鍊錶找他們的第乙個公共節點(右對齊)

slistnode *getintersectionnode(slistnode *heada, slistnode *headb)

for (cur = headb; cur; cur = cur->next)

gap = abs(lena - lenb);//找到兩個鍊錶的長度之差

if (lena < lenb)

for (i = 0; i < gap; i++)//讓長的鍊錶走到和短的鍊錶一樣的起點

for (; longerlist&&shorterlist; longerlist = longerlist->next, shorterlist = shorterlist->next)//讓兩鍊錶一起走直到找到兩鍊錶相同的位址結束迴圈 }

return null;

}

3,給定乙個鍊錶,返回鍊錶開始入環的第乙個節點,如果鍊錶無環,則返回null(題目詳情見

//找乙個鍊錶入環的第乙個節點,如果無環返回null

slistnode *detectcycle(slistnode *head)//設定兩個指標fast和slow,fast的速度是slow的兩倍,當fast與slow相等的時候就是他們的相遇點

} for (; fast&&fast->next; fast = fast->next, head = head->next)//從相遇點和從頭節點到入環的第乙個相遇點的距離是一樣的,當找到他們距離相等的點就是入環的第乙個節點 }

}

約瑟夫環問題

int __main()

plast->next = phead;

cur = plast;

for (; m > 1; m--)

slisteraseafter(cur);

} printf("%d", cur->data);

free(cur);

system("pause");

return 0;

}

DS 迴圈雙向鍊錶介面的實現及其應用

宣告檔案list.h list.h ifndef list h define list h include include includetypedef int ltdatatype typedef struct listnode listnode typedef struct list list ...

鍊錶的概念及常用操作

案例1 單向鍊錶的建立 遍歷 插入 刪除操縱 include include includetypedef struct node slist 建立鍊錶 slist slist create phead data 0 phead next null pcurrent phead printf inp...

單鏈表的鍊錶拆分

1.定義三的指標變數 p q t,p 指向原鍊錶的頭結點 head1 新建另乙個頭結點 head2,q 指向head2,t 指向head1 的next 結點,兩個頭結點的 next 都設為空。2.按照條件分配t 指向的結點,如果將這個結點連線到 head1 的鍊錶中,1 讓p的 next 指向t 2...