線性表之鍊錶

2021-08-09 16:09:17 字數 3452 閱讀 5026

1.初始化

void initlist(list plist)

assert(plist!=null);

if(plist==null)

//plist->data;//不使用

plist->next=null;

2.頭插

bool insert_head(list plist,int val)//時間複雜度為o(1)

node *p = (node *)malloc(sizeof(node));

p->data = val;

p->next = plist->next;

plist->next = p;//p就指向malloc分配空間的位址(即sizeof裡的東西)

node newnode;//1

newnode.data = val;//2

newnode.next = plist->next;//4  防止氣球飛走( 防止記憶體洩漏)

plist->next = &newnode;//3

return true;

3.尾插

bool insert_tail(list plist,int val)//o(n)

node *p = (node *)malloc(sizeof(node));

p->data = val;

node *q;

for(q = plist;q->next!=null;q = q->next);//找尾巴

//將p插入在q之後

p->next = q->next;//p->next = null;

q->next = p;

return true;

4.查詢

node *srearch(list plist,int key)

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

if(p->data == key)

return p;

return null;

5.刪除    刪除依賴於前驅

bool delete(list plist,int key)

node *p;//p是q的前驅

for(p = plist;p->next!=null;p = p->next)

if(p->next->data == key)

node *q = p->next;//記錄要刪除的節點

p->next = q->next;

free(q);

return true;

}return false;

6.獲取資料節點個數(不包含頭節點)

int getlength(list plist)

int count = 0;

for(node *p = plist->next;p!=null;p = p->next)//遍歷所有資料節點

return count;

7.判斷鍊錶是否為空(不包含頭節點)

bool isempty(list plist)

return plist->next == null;

8.清除資料

void clear(list plist)

destroy(plist);

9.摧毀資料

(1)最簡單的方法

void destroy(list plist)

node *p;

while(plist->next!=null)

//為什麼用plist->next而不用plist?

//這個摧毀資料的方法是最簡單的,只摧毀最前面的第乙個資料,後面的挨個向前走,正如排隊買飯,阿姨不動,而同學們打乙份,走乙個人

(2)逐個摧毀

void destroy(list plist)

node *p = plist->next;

node *q;

while(p!=null)

plist->next = null;

} 10.列印

void show(list plist)

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

printf("\n");

11.得到某一位置的元素

//第一資料節點的pos為0

bool getelen(list plist,int pos,int *rtval)

if(pos<0 || pos>getlength(plist))

int i = 0;

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

i++;

}return false;

12.得到結點p的前驅

static node *getpri(list plist,node *p)

for(node *q = plist;q->next!=null;q = q->next)

}return null;

13.逆置

void reverse(list plist)//考試的重點內容

if(plist == null || plist->next == null || plist->next->next == null)//分別是:這個鍊錶不存在;只有乙個頭結點;只有乙個資料元素

//下面的時間複雜度為o(n),並且最好,利用頭插的思想

node *p = plist->next;

node *q;

plist->next = null;//保證最後乙個結點的next項為null

while(p!=null)

//因為q儲存了後面的結點,所以將p與後面的結點斷開沒有關係,再與前面的plist相連

//下面的時間複雜度為o(n)    向後轉

node *p = plist->next;

node *q = p->next;

node *s;

p->next = null;//保證最後乙個結點的next項為null

while(q != null)//注意區分q和q->next的區別

s = q->next;

q->next = p;//反轉

p = q;

q = s;

plist->next = p;將反轉後的第乙個結點與頭結點相連

//下面方法的時間複雜度為o(n^2)

node *p = plist->next;

node *q;

int tmp;

for(node *q = plist;q!=null;q = q->next);//注意這不是for迴圈巢狀

for(int i = 0;i

*/14.煉表裡不再有重複的元素

void unique(list plist)

node *p;

node *q;

for(p = plist->next;p!=null;p = p->next)}}

線性表之鍊錶

鏈式的線性表適用於經常進行刪除,插入操作的工作,如 訂票系統。鍊錶是用乙個乙個的節點連線起來的表,在物理上不是連續的,在邏輯上是連續的。通過節點間的指標指向來表示節點間的關係。所以在進行鍊錶操作之前,要先定義乙個節點結構。節點結構包含兩個東西 資料域,指標域。資料域就是用來存放資料的,指標域是用來表...

線性表之鍊錶

1,為什麼要使用鍊錶 1,順序表的長度是固定的,如果超出分配的長度就會造成溢位,如果存放的資料太少則會造成空間浪費。2,在插入元素和刪除元素時 尤其不在尾部時 會移動大量的元素,造成效能和效率低下。基於以上問題,使用鍊錶可以很好地避免順序表中出現的問題。這也是我們要使用鍊錶的原因。2,鍊錶的儲存結構...

線性表之鍊錶

1 實驗專案一 線性表的基本操作及其應用 兩次實驗課完成 definition of sequential list typedef struct sqlist definition of linked list typedef struct lnodelnode,linklist 實驗要求 1 程...