基本概念
鏈式儲存定義
為了表示每個資料元素與其直接後繼元素之間的邏輯關係,每個元素除了儲存本身的資訊外,還需要儲存指示其直接後繼的資訊。
表頭結點
鍊錶中的第乙個結點,包含指向第乙個資料元素的指標以及鍊錶自身的一些資訊
資料結點
鍊錶中代表資料元素的結點,包含指向下乙個資料元素的指標和資料元素的資訊
尾結點鍊錶中的最後乙個資料結點,其下一元素指標為空,表示無後繼。
鍊錶技術領域推演
鍊錶鏈式儲存_api實現分析
在c語言中可以用結構體來定義鍊錶中的指標域
鍊錶中的表頭結點也可以用結構體實現
帶頭結點、位置從0的單鏈表
返回鍊錶中第3個位置處,元素的值
linklistnode* linklist_get(linklist* list, int pos)
tlinklist *tlist = null;
tlist = (tlinklist *)list;
linklistnode *cur = null;
cur = &(tlist->header);
for (int i = 0; i < pos; ++i)
return cur->next;
}
返回第三個位置的
移動pos次以後,當前指標指向**?
答案:指向位置2,所以需要返回 ret = current->next;
備註:迴圈遍歷時, 遍歷第1次,指向位置0
遍歷第2次,指向位置1
遍歷第3次,指向位置2
遍歷第n次,指向位置n-1;
刪除元素
**:
// linklist.h
#ifndef _mylinklist_h_
#define _mylinklist_h_
typedef void linklist;
typedef struct _tag_linklistnode
linklistnode;
linklist* linklist_create();
void linklist_destroy(linklist* list);
void linklist_clear(linklist* list);
int linklist_length(linklist* list);
int linklist_insert(linklist* list, linklistnode* node, int pos);
linklistnode* linklist_get(linklist* list, int pos);
linklistnode* linklist_delete(linklist* list, int pos);
#endif
// linklist.cpp
#include #include #include "linklist.h"
using namespace std;
typedef void linklist;
typedef struct _tag_linklist
tlinklist;
linklist* linklist_create()
memset(tmp, 0, sizeof(tlinklist)); // 初始化為空鍊錶
return tmp;
}void linklist_destroy(linklist* list)
free(list);
return;
}void linklist_clear(linklist* list)
tlinklist *tlist = null;
tlist = (tlinklist *)list;
tlist->header.next = null;
tlist->length = 0;
return;
}int linklist_length(linklist* list)
tlinklist *tlist = null;
tlist = (tlinklist *)list;
return tlist->length;
}int linklist_insert(linklist* list, linklistnode* node, int pos)
tlinklist *tlist = null;
tlist = (tlinklist *)list;
linklistnode *cur = null;
cur = &(tlist->header);
// 對pos的容錯處理,如果pos過大,改為最後面
if (pos > linklist_length(list))
// 移動到需要插入的位置
for (int i = 0; i < pos; ++i)
// 插入
node->next = cur->next;
cur->next = node;
++tlist->length;
return 0;
}linklistnode* linklist_get(linklist* list, int pos)
tlinklist *tlist = null;
tlist = (tlinklist *)list;
linklistnode *cur = null;
cur = &(tlist->header);
for (int i = 0; i < pos; ++i)
return cur->next;
}linklistnode* linklist_delete(linklist* list, int pos)
tlinklist *tlist = null;
tlist = (tlinklist *)list;
linklistnode *cur = null;
cur = &(tlist->header);
for (int i = 0; i < pos; ++i)
linklistnode *ret = null;
ret = cur->next;
// 刪除結點
cur->next = ret->next;
--tlist->length;
return ret;
}
// main.cpp
#include #include #include "linklist.h"
using namespace std;
typedef struct _student
student;
int main()
printf("age: %d\n", tmp->age);
} // 刪除鍊錶結點
while (linklist_length(list))
printf("age: %d\n", tmp->age);
} linklist_destroy(list);
return 0;
}
優點:無需一次性定製鍊錶的容量
插入和刪除操作無需移動資料元素
缺點:資料元素必須儲存後繼元素的位置資訊
獲取指定資料的元素操作需要順序訪問之前的元素
工程詳情:
github
線性表鏈式儲存設計與實現
ifndef mylinklist h define mylinklist h typedef void linklist typedef struct tag linklistnode linklistnode linklist linklist create void linklist dest...
線性表 鏈式儲存實現
定義 邏輯上連續,物理上可以分散的線性表儲存方式。可以充分利用不連續空間,但是由於需要儲存後繼節點指標,故空間開銷大。結構定義 定義乙個頭節點 其儲存帶值節點個數 和 第乙個帶值節點指標 typedef struct linklistlist 基本操作 list createlist l data ...
線性表鏈式儲存
線性表鏈式儲存結構的建立 刪除最小值結點 值唯一 刪除某個指定值 不唯一 就地逆置 反向輸出 遞增排序 刪除重複結點 根據奇偶序號劃分成兩個帶頭結點的單鏈表。include stdio.h include stdlib.h typedef struct lnode lnode,llist void ...