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 程...