單迴圈鍊錶基本操作及部分可能出現的細節問題

2022-05-09 20:39:08 字數 4093 閱讀 5031

最近在學資料結構

目前是最基礎的線性表部分

看完書之後感覺差不多了,自己寫的時候還是出現了許多小問題…

因此我覺得新手學習還是很有必要親自操作一遍,雖然比較費時間,但是能加深理解

下面的注釋裡有我出現的一些問題及相應的解決方案

注釋應該比較詳細

#include

#include

using

namespace std;

struct list

;list*

create_list

(int n)

;//頭插法

list*

create_list2

(int n)

;//尾插法

intprintf_list

(list* first)

;list*

find_e

(list*first,

int e)

;list*

find_before

(list*first,

int e)

;list*

insert_e

(list*

&first,

int e,

int c)

;list *

delete_e

(list*

&first)

;list*

delete_thek

(list*first)

;list*

insert_thek

(list*first,

int e)

;//在第k個位置前插入元素e

void

destroy_list

(list*first)

;int

disnum

(list*first)

;list*

findptail

(list*first)

;//找尾結點

void

update

(list*first)

;//更新函式長度及內容

int list::length=0;

intmain()

case2:

case3:

case4:

case5:

case6:

case7:

case8:

default:}

if(flag==1)

}return0;

}//頭插法建立乙個n個節點的單迴圈鍊錶

list*

create_list

(int n)

p1->next=first;

return first;

}//尾插法建立乙個n個節點的單迴圈鍊錶

list*

create_list2

(int n)

first-

>next=

null

; pnew=ptail=first;

for(

int i=

0;i1;i++

) list::length=n;

ptail-

>next=first;

update

(first)

;return first;

}//列印整個鍊錶

intprintf_list

(list* first)

while

(p->next!=first)

cout<>ele

}//查詢第乙個值為e的節點

list*

find_e

(list*first,

int e)

//之前沒找到,再看是否是尾結點

if(p-

>ele==e)

return p;

//若仍未找到

cout<<

"error,"

<" doesn't exist in list"

null

;//返回null是否合適待確定

}//查詢第乙個值為e的直接前驅

list*

find_before

(list*first,

int e)

return p;

}//若e在第乙個,則第乙個的前驅節點為尾結點

//若e不在第乙個,則遍歷鍊錶找e

while

(p->next-

>ele!=e&&p-

>next-

>next!=first)

if(p-

>next-

>ele==e)

return p;

//若在倒數第二個之前找到,返回

//否則,未找到

else

}///在把首節點的前驅作為最後乙個節點時,希望插入到第乙個元素前--但實際上是插在了認為的前驅----最後乙個節點處

//在第乙個值為e的節點前插入值為c的節點

list*

insert_e

(list*

&first,

int e,

int c)

ptail-

>next=p1;

first=p1;

list::length++

;update

(first)

;return first;

} list* p1=

new list;

//新節點

p1->ele=c;

p1->next=p-

>next;

p->next=p1;

list::length++

;update

(first)

;return first;

}list*

insert_thek

(list*first,

int e)

else

if(k==1)

else

q=new list;

q->next=p-

>next;

p->next=q;

q->ele=e;

list::length++

;update

(first);}

return first;

}//刪除第乙個值為e的節點

list *

delete_e

(list*

&first)

else

}//刪除第k個位置上的元素

list*

delete_thek

(list*first)

else

//此時p指向第k個的前驅

q=p-

>next;

//q指向第k個節點

p->next=q-

>next;

delete

(q);

list::length--

;update

(first);}

return first;

}void

destroy_list

(list*first)

list::length=0;

cout<<

"鍊錶已銷毀\n"

;delete

(first);}

///另乙個問題是,當查詢找不到元素e時,會直接結束程式,而不是重新輸入,待處理........

intdisnum

(list*first)

list*

findptail

(list*first)

return p;

}void

update

(list*first)

///還有乙個問題是,在插入和刪除時,雖然最後修改了首節點,但是只是在該函式內完成,其作用域是**塊,函式呼叫結束時指標

///也被釋放,指標並沒有被真正修改,而返回的首指標也並沒有用到,應該用二級指標或者---指標型別的引用

雙向迴圈鍊錶基本操作

include include include typedef struct node linklist void clear 清屏 linklist init doublelinklist 初始化雙向迴圈鍊錶 void creat doublelinklist linklist 建立雙向迴圈鍊錶 ...

迴圈鍊錶的基本操作

定義 typedef struct dulnode dulnode,dulinklist 構造迴圈鍊錶 與單鏈表不同的是l next l 而不是l next null bool initdulist dulinklist l l next l 這裡不是 null printf 初始化成功!n 尾插法...

雙向鍊錶基本操作以及優化可能

面試時面試官要求手寫雙向鍊錶的 刪除操作,當時沒有考慮到邊界條件,導致被刷 現在 列舉下 以及優化,作為事後反思 typedefstruct doublelink double link 建立乙個雙鏈表 double link createdoublelink 插入節點 bool insertnod...