#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
注意相應的控制代碼的定義 tlinklist
#include #include #include #include "linklist.h"
typedef struct _tag_linklist
tlinklist; //定義乙個底層的控制代碼
linklist* linklist_create()
void linklist_destroy(linklist* list) //釋放記憶體
}void linklist_clear(linklist* list) //初始化
tlist = (tlinklist*)list;
tlist->length = 0;
tlist->header.next = null;
}int linklist_length(linklist* list)
tlist = (tlinklist*)list;
return tlist->length;
}int linklist_insert(linklist* list, linklistnode* node, int pos)
tlist = (tlinklist*)list;
current = &(tlist->header); //重點:讓輔助指標變數指向鍊錶頭部
for (i = 0; i < pos && (current->next != null); i++) //防止pos位置太大,超過鍊錶長度
//1 讓node連線後續鍊錶
node->next = current->next; //鍊錶是單向的,3號位置儲存在2號位置的next域中
//2 讓前面的節點連線到新的node節點
current->next = node;
tlist->length++;
return ret;
}linklistnode* linklist_get(linklist* list, int pos)
tlist = (tlinklist*)list;
current = &(tlist->header); //重點:讓輔助指標變數指向鍊錶頭部
for (i = 0; i < pos && (current->next != null); i++) //防止pos位置太大,超過鍊錶長度
return current->next;
}linklistnode* linklist_delete(linklist* list, int pos)
tlist = (tlinklist*)list;
current = &(tlist->header); //重點:讓輔助指標變數指向鍊錶頭部
for (i = 0; i < pos && (current->next != null); i++) //防止pos位置太大,超過鍊錶長度
//1 快取被刪除的節點位置
ret = current->next;
//2 連線
current->next = ret->next; //這樣刪除到最後乙個會出現ret=null而沒有ret->next,引發異常?
tlist->length--;
return ret;
}
#include #include #include #include "linklist.cpp"
typedef struct _teacher
teacher;
void main()
ret = linklist_insert(list, (linklistnode*)&t1, 0); //頭插法 插入線性表
ret = linklist_insert(list, (linklistnode*)&t2, 0); //頭插法
ret = linklist_insert(list, (linklistnode*)&t3, 0); //頭插法
ret = linklist_insert(list, (linklistnode*)&t4, 0); //頭插法
ret = linklist_insert(list, (linklistnode*)&t5, 0); //頭插法,所以t5是第乙個
len = linklist_length(list);
//遍歷
for (i = 0; i < len; i++)
printf("tmp->age: %d \n", tmp->age);
} //刪除元素
while (linklist_length(list) > 0) //此處不能用len替代,因為linklist_length(list)一直在變
printf("tmp->age: %d \n", tmp->age);
} linklist_destroy(list);
system("pause");
}
小結點linklistnode與業務結點teacher的連線問題
會分析相應技術場景圖(圖的繪畫)
線性表 鏈式儲存實現
定義 邏輯上連續,物理上可以分散的線性表儲存方式。可以充分利用不連續空間,但是由於需要儲存後繼節點指標,故空間開銷大。結構定義 定義乙個頭節點 其儲存帶值節點個數 和 第乙個帶值節點指標 typedef struct linklistlist 基本操作 list createlist l data ...
線性表鏈式儲存設計與實現 API實現
基本概念 鏈式儲存定義 為了表示每個資料元素與其直接後繼元素之間的邏輯關係,每個元素除了儲存本身的資訊外,還需要儲存指示其直接後繼的資訊。表頭結點 鍊錶中的第乙個結點,包含指向第乙個資料元素的指標以及鍊錶自身的一些資訊 資料結點 鍊錶中代表資料元素的結點,包含指向下乙個資料元素的指標和資料元素的資訊...
線性表鏈式儲存
線性表鏈式儲存結構的建立 刪除最小值結點 值唯一 刪除某個指定值 不唯一 就地逆置 反向輸出 遞增排序 刪除重複結點 根據奇偶序號劃分成兩個帶頭結點的單鏈表。include stdio.h include stdlib.h typedef struct lnode lnode,llist void ...