帶頭節點的不迴圈單鏈表相關操作

2021-10-05 22:45:50 字數 4838 閱讀 3924

建立list.h標頭檔案

#pragma once

//頭結點:開頭標識,類似旗幟,不存放資料,不參與運算

//資料結點:存放資料

typedef

struct node

node,

*plist;

//初始化

void

initseqlist

(plist plist)

;//頭插

bool insert_head

(plist plist,

int val)

;//尾插

bool insert_tail

(plist plist,

int val)

;//在plist中查詢關鍵字key,找到後返回位址,失敗返回-1

node *

search

(plist plist,

int key)

;//判空

bool isempty

(plist plist)

;//刪除第乙個key值

bool deleteval

(plist plist,

int key)

;//獲取資料長度

intgetlength

(plist plist)

;//顯示

void

show

(plist plist)

;//清空資料

void

clear

(plist plist)

;//銷毀動態記憶體

void

destroy

(plist plist)

;

建立list.cpp檔案

#include

#include

#include

#include

"list.h"

/*注意事項:

1.找後乙個節點是p=p->next;不能寫成p++

*///判空

static

void

deterpointnull

(plist plist)

}//初始化

void

initseqlist

(plist plist)

//頭插

bool insert_head

(plist plist,

int val)

//尾插

bool insert_tail

(plist plist,

int val)

//在plist中查詢關鍵字key,找到後返回位址,失敗返回空指標

node *

search

(plist plist,

int key)

}return

null;}

//判空

bool isempty

(plist plist)

//刪除plist中的第乙個key

bool deleteval

(plist plist,

int key)

if(q->data==key)

}return false;

}//獲取資料長度

intgetlength

(plist plist)

return count;

}//顯示

void

show

(plist plist)

printf

("\n");

}//清空資料

void

clear

(plist plist)

//銷毀動態記憶體

//總是刪除第乙個資料結點

void

destroy

(plist plist)}/*

//銷毀動態記憶體

void destroy(plist plist)

plist->next=null;

}*/

其他功能:

1.已知遞增有序的單鏈表a,b,c分別儲存了乙個集合,設計演算法實現a:au(bnc),並使求解結構a仍保持遞增。

要求演算法的時間複雜度為o(|a|+|b|+|c|)。其中,|a|為集合a的元素個數

void

calculate

(plist plista,plist plistb,plist plistc)

p1=p1->next;

}else

if(p1->next->data==p2->data)

else

}else

if(p2->datadata)

else

if(p2->data>p3->data)}}

intmain()

2.將鍊錶逆置

//演算法1:利用棧實現(利用陣列模擬棧)//時間複雜度:o(n)  空間複雜度:o(n)

void

reverse1

(plist plist)

//金屬組中的資料從後往前,再賦值到鍊錶中

i=len-1;

//最後乙個元素的下標

for(node *p=plist->next;p!=

null

;p=p->next)

free

(arr);}

//演算法2:利用頭插和尾插相反的演算法 //o(n) o(1)

void

reverse

(plist plist)

}

3.給定單鏈表,檢測是否有環,並返回相遇結點

//查詢相遇結點

static plist iscircle

(plist plist)

q=q->next;

if(p==q)

}return

null;}

//判斷是否有環

plist iscirclelist

(plist plist)

//求入環的第乙個節點

node *p=pnode;

//相遇結點

node *q=plist;

//頭結點

while

(p!=q)

//有環,不為null

return p;

//肯定為入環的第乙個節點

}

4.給定兩個單鏈表(head1,head2),檢測兩個鍊錶是否有交點,如果有,返回第乙個交點

思路1:通過兩個指標,直接跑到最後乙個結點,判斷兩個結點的位址是否相等,但是不返回第乙個交點

2思路:求得兩個鍊錶的長度,求差值,指向長的鍊錶的指標先跑差值的節點數,兩個指標再同時往後跑,每跑乙個節點,判斷其位址是否相等,則直接返回其中乙個指標,這就是相交的第乙個節點

plist twolistintersec1

(plist plista,plist plistb)

}else

}//查詢並返回相交的第乙個節點

while

(p!=

null

&& q!=

null

) p=p->next;

q=q->next;

}return

null

;}

5.只給定單鏈表中某個結點p(並非最後乙個結點,即p->next!=null)指標,刪除該結點 o(1)

思路:如果查詢前驅結點,那麼時間複雜度必然為o(n),所以此處採取將p->next的結點賦值給p,然後刪除p->next結點,從而實現對p結點的刪除

bool deletenode

(plist plist,node *p)

node *q=p->next;

p->data=q->data;

p->next=q->next;

free

(q);

return true;

}

6.只給定單鏈表中某個節點p(非空節點),在p前面插入乙個節點,時間複雜度為o(1)

bool insertnode

(plist plist,node *p,

int val)

node *q=

(node *

)malloc

(sizeof

(node));

q->data=p->data;

q->next=p->next;

p->data=val;

p->next=q;

return true;

}

7.給定單鏈表頭結點,刪除鍊錶中倒數第k個結點

bool deletebottomk

(plist plist,

int k)

int len =

getlength

(plist)

-k;//刪除節點的位置

for(

int i=

0;i1;i++

) node *q=p->next;

p->next=p->next->next;

free

(q);

return true;

}

單鏈表操作(帶頭節點)

帶頭節點的單鏈表 include include typedef struct lnodenode linklist bool initlist linklist 初始化單鏈表 bool listinsert linklist int int 在指定位置插入資料 bool empty linklis...

帶頭節點單鏈表的操作

我們來看單鏈表的銷毀,排序,逆置 首先還是來看一下單鏈表的銷毀 我們能不能將單鏈表的操作像順序表一樣直接將他的size變成0然後直接釋放掉指向他的空間?void listdestory slist psl 我們知道鍊錶儲存資料最大的不同就是不是一段連續的空間,如果釋放鍊錶空間,需要釋放每乙個節點的空...

單鏈表的操作(帶頭節點)

typedef struct lnodelnode,linklist 鍊錶的各種具體操作函式 bool initlist linklist l 鍊錶的初始化 bool empty linklist l 判斷鍊錶是否為空 intlength linklist l 求單鏈表的長度 bool listin...