鏈式儲存定義
為了表示每個資料元素與其直接後繼元素之間的邏輯關係,每個元素除了儲存本身的資訊外,還需要儲存指示其直接後繼的資訊。
表頭結點
鍊錶中的第乙個結點,包含指向第乙個資料元素的指標以及鍊錶自身的一些資訊
資料結點
鍊錶中代表資料元素的結點,包含指向下乙個資料元素的指標和資料元素的資訊
尾結點鍊錶中的最後乙個資料結點,其下一元素指標為空,表示無後繼。
在c語言中可以用結構體來定義鍊錶中的指標域,
鍊錶中的表頭結點也可以用結構體實現
帶頭結點、位置從0的單鏈表
返回鍊錶中第3個位置處,元素的值
linklistnode* linklist_get(linklist* list, int pos)
current = (linklistnode *)tlist;
for (i=0; inext;
}ret = current->next;
return ret ;
}
返回第三個位置的
移動pos
次以後,當前指標指向**?
答案:指向位置2
,所以需要返回
ret = current->next;
備註:迴圈遍歷時, 遍歷第1
次,指向位置0
遍歷第2
次,指向位置1
遍歷第3
次,指向位置2
遍歷第n
次,指向位置
n-1;
所以如果想返回位置n
的元素的值,需要怎麼做
ret = current->next;
此問題是:指向頭結點的指標移動n
次 和 第
n個元素之間的關係?
刪除元素
優點:無需一次性定製鍊錶的容量
插入和刪除操作無需移動資料元素
缺點:資料元素必須儲存後繼元素的位置資訊
獲取指定資料的元素操作需要順序訪問之前的元素
程式演示:(此程式實現演算法與程式型別分離)
標頭檔案
#ifndef _zeng_
#define _zeng_
typedef void linklist;
//注意該結構體位址等於&next位址
typedef struct xiaozeng
linklistnode;//結點
//建立頭結點
linklist *linklist_create();
//銷毀鍊錶
void linklist_destroy(linklist *list);
//鍊錶清空
void linklist_clear(linklist *list);
//獲取鍊錶長度
int linklist_length(linklist *list);
//插入結點位址
void linklist_insert(linklist *list, linklistnode *node, int pos);
//得到結點位址
linklistnode *linklist_get(linklist *list, int pos);
//得到刪除結點位址
linklistnode *linklist_delete(linklist *list, int pos);
#endif
實現.c
#include"1.h"
#include#include#includetypedef struct _zzzz
tlinklist;
//建立鍊錶
linklist *linklist_create()
ret->length = 0;//初始化為空
ret->header.next = null;
return ret;//返回頭結點位址
}//銷毀結點
void linklist_destroy(linklist *list)
free(tmp);//釋放記憶體
}//鍊錶清空
void linklist_clear(linklist *list)
tmp->length = 0;//長度置0
tmp->header.next = null;
return;
}//獲取鍊錶長度
int linklist_length(linklist *list)
return tmp->length;//返回長度
}//插入結點 //表頭 //插入結點 //位置,從0號開始
void linklist_insert(linklist *list, linklistnode *node, int pos)
//容錯性,使得不斷為空
if (pos>linklist_length(list))
for (int i = 0; i < pos && (current->next != null); i++)
//現在current指向pos前乙個結點
node->next = current->next; //先將前乙個結點儲存的位址賦值給node->next
current->next = node; //再將node位址賦給current->next;兩步實現插入
tmp->length++; //插入後長度+1
return;
}//獲得指定位置結點位址
linklistnode *linklist_get(linklist *list, int pos)
for (int i = 0; i < pos && (current->next != null); i++)
//現在current指向pos前乙個結點
return current->next;
}//刪除乙個結點並返回該刪除結點位址
linklistnode *linklist_delete(linklist *list, int pos)
for (int i = 0; i < pos && (current->next != null); i++)
linklistnode *bao = current->next;//緩衝儲存
current->next = current->next->next;//刪除該結點,就是把指向該結點變成指向該結點指向的結點
tmp->length--;//長度-1
return bao;//返回其結點
}
主函式
#include#include#include#include"1.h"
typedef struct teacher //即將被插入結點
企業級資料結構 棧的鏈式儲存設計與實現
鏈式棧是一種特殊的鍊錶,下面實現的 是基於鍊錶而來的,請參考前幾篇的部落格 linkstack.h ifndef my linkstack h define my linkstack h typedef void linkstack linkstack linkstack create void l...
資料結構之順序表
首先是標頭檔案seqlist.h ifndef seqlist h define seqlist h include includeusing namespace std define elemtype int define seqlist default size 10 typedef struc...
資料結構之順序表
順序表的思想容易了解,但是 不容易掌握,我這裡根據老師所提供的 進行一下簡單的總結 這個 包含順序表的查詢,插入,刪除,建表,輸出資料 includeusing namespace std define ok 1 define error 0 define overflow 2 typedef in...