資料結構 單鏈表

2021-08-02 08:46:46 字數 3996 閱讀 3914

前面介紹了順序表的特點和實現!但是順序表有很多的不足,比如要給順序表的前面插入乙個資料,就必須先把後面的資料先乙個乙個的往後挪動,然後再將所要插入的資料放進去。就相當於乙個陣列一樣。

還有就是順序表的大小分配,如果採用靜態分配記憶體的方式,那麼勢必就會造成剩餘記憶體的浪費,不利於cpu工作。要是用動態記憶體分配,可以減少記憶體浪費情況,但是一次性開闢的記憶體不能太大也不能太小,遇到乙個結構體資料剛剛存放滿,這時候在想增加資料就要再申請空間,那麼申請的空間只用了乙個,其他的也就造成了浪費。

所以這時候為了方便儲存,和更加節省空間,就採用了單鏈表的方式。先來看看為什麼單鏈表有這麼多好處

單鏈表採用上乙個節點的頭結點和下個節點相鄰,相當於把好多的資料直接連起來,用的時候只需要改變節點之間的連線。而且增容是一次增加乙個節點的大小,實現了真正的用多少分配多少。

寫單鏈表的時候一定要注意你的首節點,別丟了,丟了就找不回來。還有就是在刪除節點的時候一定要對那個節點負責,不然讓它成為野指標了,對誰都不好。

單鏈表如何實現,還有介面怎麼封裝,具體在程式中看一下,重點部分都做了標識。

listnode.h

#ifndef _listnode_h_

#define _listnode_h_

#include #include #include typedef int datatype;

typedef struct listnode

listnode;

void pushback(listnode **pplist, datatype x);//從後面插入乙個data為x的節點

void popback(listnode **plist); //從後面刪除乙個節點

void printlist(listnode *plist); //列印單鏈表

void pushfront(listnode **pplist, datatype x); //從前面插入乙個data為x的節點

void popfront(listnode **pplist); //從前面刪除乙個節點

listnode* find(listnode* plist, datatype x); //查詢data為x的節點,並返回這個節點

//在pos前插入||刪除

void insert(listnode **pplist, listnode *pos, datatype x);//在所指定的節點前插入乙個data為x的節點

void erase(listnode **pplist, listnode *pos);//刪除指定的節點

#endif

listnode.cpp

#include "listnode.h"

listnode *buynode(datatype x) //生成節點封裝介面

void printlist(listnode *plist)//列印單鏈表

printf("null\n");

}void pushback(listnode **pplist, datatype x)//在做這些之前要先理清思路,都有哪幾種情況,然後敲

else if((*pplist)->next == null)

else

cur->next = buynode(x); }}

void popback(listnode **pplist)//和push一樣都要考慮清楚,然後就很好寫

else if((*pplist)->next == null)

else

free(tmp);//刪除指定節點

cur->next = null;//將上個節點的next給置空

tmp = null;//記得置空 }}

void pushfront(listnode **pplist, datatype x)//和尾插一樣,只是情況還要具體分析

else }

void popfront(listnode **pplist)

else if((*pplist)->next == null)

else }

listnode* find(listnode* plist, datatype x)//查詢節點並不改變資料,所以不用傳結構體指標的位址

plist = plist->next;

} //perror("find"); //出錯列印錯誤資訊

//system("pause");

//exit(exit_failure);//程式直接退出

return null;

}void insert(listnode **pplist, listnode *pos, datatype x)//先調find

else if(((*pplist)->next == null) || (pos == *pplist))

else

listnode *p = buynode(x);

tmp->next = p;

p->next = pos; }}

void erase(listnode **pplist, listnode *pos)//要刪除首先就要呼叫find函式查詢到相應的節點

為了更加明確的了解鍊錶的增刪查改,在linux環境下來演示一下具體的過程

#include "listnode.h"

struct listnode* plist;

void test1()

while(j<5)

}void test2()

while(j<5)

}void test3()

pos = find(plist, 2);

printf("查詢單鏈表裡資料為2的節點i\n");

printf("給2的前面插入5\n");

insert(&plist, pos, 5);

printlist(plist);

sleep(1);

printf("刪除2\n");

資料結構單鏈表

初學資料結構,貼段自己編寫的單鏈表程式,希望自己能夠一直以強大的學習熱情持續下去!自勉!2012年3月30日 於大連 include using namespace std typedef struct node linklist,node linklist makelist int n void ...

資料結構 單鏈表

今天浪費了好多時間,也許是心裡想著明天的考試吧 可自己也知道這次的考試,自己畢竟過不了了,只好等到今年11月份,想想那時自己已經大三了 還有那麼多時間嗎!很懊惱今天不知怎麼回事,感嘆環境真的可以影響乙個人,真的可以 把今天的學習筆記寫下來,沒有進行好好的整理,這回單鏈表的功能較多,操作比較散,最後乙...

資料結構 單鏈表

實現乙個單鏈表 1 查詢 查詢第index個節點 查詢指定的元素 2 插入 將指定的元素插入到第index個節點上 3 刪除 將第index個節點刪除 規律 刪除和新增元素前務必儲存兩個元素的位址引用資訊 public class mylinkedlist 記錄鍊錶結構的頭結點位址引用 privat...