線性表鏈式儲存設計與實現 API實現

2021-07-03 18:19:30 字數 4097 閱讀 2855

基本概念

鏈式儲存定義

為了表示每個資料元素與其直接後繼元素之間的邏輯關係,每個元素除了儲存本身的資訊外,還需要儲存指示其直接後繼的資訊。

表頭結點

鍊錶中的第乙個結點,包含指向第乙個資料元素的指標以及鍊錶自身的一些資訊

資料結點

鍊錶中代表資料元素的結點,包含指向下乙個資料元素的指標和資料元素的資訊

尾結點鍊錶中的最後乙個資料結點,其下一元素指標為空,表示無後繼。

鍊錶技術領域推演

鍊錶鏈式儲存_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 ...