前面介紹了順序表的特點和實現!但是順序表有很多的不足,比如要給順序表的前面插入乙個資料,就必須先把後面的資料先乙個乙個的往後挪動,然後再將所要插入的資料放進去。就相當於乙個陣列一樣。
還有就是順序表的大小分配,如果採用靜態分配記憶體的方式,那麼勢必就會造成剩餘記憶體的浪費,不利於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...