資料結構之鍊錶

2021-09-20 10:22:37 字數 2493 閱讀 1768

順序表的增容需要malloc一段新空間,如果這個空間足夠大,我們用不完這些空間勢必就會造成空間的浪費。而且我們增容之後還要拷貝原空間的資料,釋放舊空間,這樣操作起來也比較麻煩。對於鍊錶就恰恰能夠解決這個問題。

單鏈表

1、邏輯上連續,位置上可以不連續的儲存方式。

2、單鏈表由無數個結點組成,每個結點都有資料段和指標域組成。其中資料段儲存資料,指標域儲存後繼的位址。

3、每個結點最多只能有乙個前繼結點和後繼結點。

4、第乙個結點沒有前繼結點,最後乙個結點沒有後繼結點。所以我們通常建立乙個頭結點來儲存鍊錶的位置,而頭節點的資料段我們不關注。由於最後乙個結點沒有後繼節點,所以我們通常將最後乙個結點的指標域置為null。

slist.h實現

#pragma once

#include typedef int datatype;

//鍊錶的結點

typedef struct slistnode node,*pnode;

typedef struct slist slist,*pslist;

//初始化

void slistinit(slist* s);

//尾插

void slistpushback(slist* s, datatype data);

//新增節點

pnode buyslistnode(datatype date);

//尾刪

void slistpopback(slist* s);

//頭插

void slistpushfront(slist* s, datatype data);

//頭刪

void slistpopfront(slist* s);

void printslist(slist* s);

void slistinsert(pnode pos, datatype data);

void slisterase(slist* s,pnode pos);

pnode slistfind(slist* s,datatype data);

size_t slistsize(slist* s);

int slistempty(slist* s);

void testslist();

slist.c實現

#include"slist.h"

#include#include#include#includevoid slistinit(slist*s)

pnode buyslistnode(datatype data)

pnewnode->data = data;

pnewnode->next = null;

return pnewnode;

}void slistpushback(slist* s, datatype data) else

pcur->next = pnewnode;

}}

void slistpopback(slist*  s)  else if (s->head->next == null)  else 

free(pcur);

ppre->next = null; }}

void slistpushfront(slist* s, datatype data) else

}

void slistinsert(pnode pos, datatype data) 

pnode pnewnode = buyslistnode(data);

pnewnode->next = pos->next;

pos->next = pnewnode;

}void slisterase(slist* s, pnode pos)

if (s->head == pos) else

if (pprepos)

} free(pos);

}

pnode slistfind(slist* s, datatype data) 

pcur = pcur->next;

} return null;

}size_t slistsize(slist* s)

return count;

}int slistempty(slist* s)

void printslist(slist* s)

printf("null\n");

}//頭刪

void slistpopfront(slist* s)

pdelnode = s->head;

s->head = pdelnode->next;

free(pdelnode);

}

void testslist() 

int main()

資料結構 表之煉表

頭插法建立 尾插法建立 顯示 銷毀 include include using namespace std typedef int elemtype typedef struct lnode linklist void createlinklistf linklist l,elemtype a,in...

資料結構之鍊錶

頭結點 第乙個有效結點之前的那個結點 頭結點並不存有效資料 加頭結點的目的主要是為了方便對鍊錶的操作 頭指標 指向頭結點的指標變數 尾指標 指向尾節點的指標變數 如果希望通過乙個函式對鍊錶進行處理,只需要乙個引數 頭指標 首先要定義乙個單鏈表儲存結構 然後建立乙個空表,即初始化,我寫的這個提前設定好...

資料結構之鍊錶

鍊錶是一種基本的資料結構型別,它由乙個個結點組成。每乙個結點包括乙個資料的儲存和乙個指向下乙個結點的引用。在這個定義中,結點是乙個可能含有任意型別資料的抽象實體,它所包含的指向結點的應用顯示了它在構造鍊錶之中的作用。和遞迴程式一樣,遞迴資料結構的概念一開始也令人費解,但其實它的簡潔性賦予了它巨大的價...