最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解析C++的線性表鏈?zhǔn)酱鎯υO(shè)計與相關(guān)的API實現(xiàn)

 更新時間:2016年03月14日 16:23:20   作者:YoferZhang  
這篇文章主要介紹了解析C++中的線性表鏈?zhǔn)酱鎯υO(shè)計與相關(guān)的API實現(xiàn),文中的實例很好地體現(xiàn)了如何創(chuàng)建和遍歷鏈表等基本操作,需要的朋友可以參考下

基本概念
鏈?zhǔn)酱鎯Χx:
為了表示每個數(shù)據(jù)元素與其直接后繼元素之間的邏輯關(guān)系,每個元素除了存儲本身的信息外,還需要存儲指示其直接后繼的信息。

2016314160729026.jpg (411×342)2016314160800178.jpg (952×421)

表頭結(jié)點:
鏈表中的第一個結(jié)點,包含指向第一個數(shù)據(jù)元素的指針以及鏈表自身的一些信息。
數(shù)據(jù)結(jié)點:
鏈表中代表數(shù)據(jù)元素的結(jié)點,包含指向下一個數(shù)據(jù)元素的指針和數(shù)據(jù)元素的信息。
尾結(jié)點:
鏈表中的最后一個數(shù)據(jù)結(jié)點,其下一元素指針為空,表示無后繼。

鏈表技術(shù)領(lǐng)域推演

2016314160930644.jpg (975×592)

鏈表鏈?zhǔn)酱鎯api實現(xiàn)分析:
在C語言中可以用結(jié)構(gòu)體來定義鏈表中的指針域,鏈表中的表頭結(jié)點也可以用結(jié)構(gòu)體實現(xiàn);

2016314160951696.jpg (663×300)

2016314161848712.jpg (804×483)

帶頭結(jié)點、位置從0的單鏈表;
返回鏈表中第3個位置處,元素的值。

LinkListNode* LinkList_Get(LinkList* list, int pos) 
{ 
 if (list == NULL || pos < 0 || pos >= LinkList_Length(list)) { 
 return NULL; 
 } 
 TLinkList *tList = NULL; 
 tList = (TLinkList *)list; 
 LinkListNode *cur = NULL; 
 cur = &(tList->header); 
 
 for (int i = 0; i < pos; ++i) { 
 cur = cur->next; 
 } 
 
 return cur->next; 
} 

返回第三個位置的。
移動pos次以后,當(dāng)前指針指向哪里?
答案:指向位置2,所以需要返回 ret = current->next。
 
備注:循環(huán)遍歷時
遍歷第1次,指向位置0;
遍歷第2次,指向位置1;
遍歷第3次,指向位置2;
遍歷第n次,指向位置n-1。

刪除元素:

2016314162023550.jpg (527×244)

代碼實例:

 linklist.h 

#ifndef _MYLINKLIST_H_ 
#define _MYLINKLIST_H_ 
 
typedef void LinkList; 
 
typedef struct _tag_LinkListNode 
{ 
 struct _tag_LinkListNode* next; 
}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 <iostream> 
#include <cstdio> 
#include "linklist.h" 
 
using namespace std; 
 
typedef void LinkList; 
 
typedef struct _tag_LinkList 
{ 
 LinkListNode header; 
 int length; 
}TLinkList; 
 
LinkList* LinkList_Create() 
{ 
 TLinkList *tmp = NULL; 
 
 tmp = (TLinkList *)malloc(sizeof(TLinkList)); 
 if (tmp == NULL) { 
 printf("function LinkList_Create() err.\n"); 
 return NULL; 
 } 
 memset(tmp, 0, sizeof(TLinkList)); // 初始化為空鏈表 
 
 return tmp; 
} 
 
void LinkList_Destroy(LinkList* list) 
{ 
 if (list == NULL) { 
 return; 
 } 
 free(list); 
 
 return; 
} 
 
void LinkList_Clear(LinkList* list) 
{ 
 if (list == NULL) { 
 return; 
 } 
 TLinkList *tList = NULL; 
 tList = (TLinkList *)list; 
 tList->header.next = NULL; 
 tList->length = 0; 
 
 return; 
} 
 
int LinkList_Length(LinkList* list) 
{ 
 if (list == NULL) { 
 return -1; 
 } 
 TLinkList *tList = NULL; 
 tList = (TLinkList *)list; 
 
 return tList->length; 
} 
 
int LinkList_Insert(LinkList* list, LinkListNode* node, int pos) 
{ 
 if (list == NULL || node == NULL || pos < 0) { 
 return -1; 
 } 
 TLinkList *tList = NULL; 
 tList = (TLinkList *)list; 
 LinkListNode *cur = NULL; 
 cur = &(tList->header); 
 
 // 對pos的容錯處理,如果pos過大,改為最后面 
 if (pos > LinkList_Length(list)) { 
 pos = LinkList_Length(list); 
 } 
 
 // 移動到需要插入的位置 
 for (int i = 0; i < pos; ++i) { 
 cur = cur->next; 
 } 
 
 // 插入 
 node->next = cur->next; 
 cur->next = node; 
 
 ++tList->length; 
 
 return 0; 
} 
 
LinkListNode* LinkList_Get(LinkList* list, int pos) 
{ 
 if (list == NULL || pos < 0 || pos >= LinkList_Length(list)) { 
 return NULL; 
 } 
 TLinkList *tList = NULL; 
 tList = (TLinkList *)list; 
 LinkListNode *cur = NULL; 
 cur = &(tList->header); 
 
 for (int i = 0; i < pos; ++i) { 
 cur = cur->next; 
 } 
 
 return cur->next; 
} 
 
LinkListNode* LinkList_Delete(LinkList* list, int pos) 
{ 
 if (list == NULL || pos < 0 || pos >= LinkList_Length(list)) { 
 return NULL; 
 } 
 TLinkList *tList = NULL; 
 tList = (TLinkList *)list; 
 LinkListNode *cur = NULL; 
 cur = &(tList->header); 
 
 for (int i = 0; i < pos; ++i) { 
 cur = cur->next; 
 } 
 
 LinkListNode *ret = NULL; 
 ret = cur->next; 
 
 // 刪除結(jié)點 
 cur->next = ret->next; 
 
 --tList->length; 
 
 return ret; 
} 


main.cpp  
 

#include <iostream> 
#include <cstdio> 
#include "linklist.h" 
 
using namespace std; 
 
typedef struct _Student 
{ 
 LinkListNode node; 
 char name[32]; 
 int age; 
}Student; 
 
int main() 
{ 
 Student s1, s2, s3, s4, s5, s6; 
 s1.age = 21; 
 s2.age = 22; 
 s3.age = 23; 
 s4.age = 24; 
 s5.age = 25; 
 s6.age = 26; 
 
 // 創(chuàng)建鏈表 
 Student *list = (Student *)LinkList_Create(); 
 
 // 插入結(jié)點 
 LinkList_Insert(list, (LinkListNode *)&s1, 0); 
 LinkList_Insert(list, (LinkListNode *)&s2, 0); 
 LinkList_Insert(list, (LinkListNode *)&s3, 0); 
 LinkList_Insert(list, (LinkListNode *)&s4, 0); 
 LinkList_Insert(list, (LinkListNode *)&s5, 0); 
 LinkList_Insert(list, (LinkListNode *)&s6, 3); 
 
 // 遍歷鏈表 
 for (int i = 0; i < LinkList_Length(list); ++i) { 
 Student *tmp = (Student *)LinkList_Get(list, i); 
 if (tmp == NULL) { 
 return 0; 
 } 
 printf("age: %d\n", tmp->age); 
 } 
 
 // 刪除鏈表結(jié)點 
 while (LinkList_Length(list)) { 
 Student *tmp = (Student *)LinkList_Delete(list, 0); 
 if (tmp == NULL) { 
 return 0; 
 } 
 printf("age: %d\n", tmp->age); 
 } 
 
 LinkList_Destroy(list); 
 
 return 0; 
} 

優(yōu)點:

  • 無需一次性定制鏈表的容量;
  • 插入和刪除操作無需移動數(shù)據(jù)元素。

缺點:

  • 數(shù)據(jù)元素必須保存后繼元素的位置信息;
  • 獲取指定數(shù)據(jù)的元素操作需要順序訪問之前的元素。

工程詳情:Github

相關(guān)文章

最新評論

南昌市| 石狮市| 平邑县| 无为县| 鹤峰县| 泸溪县| 宜昌市| 孝昌县| 芜湖县| 北碚区| 永新县| 海原县| 自治县| 库车县| 凤翔县| 乐都县| 莎车县| 屯留县| 临清市| 巴林右旗| 韶关市| 共和县| 从化市| 贵溪市| 乌鲁木齐县| 分宜县| 苗栗县| 革吉县| 长岛县| 唐河县| 新蔡县| 乾安县| 淮阳县| 河池市| 铜梁县| 论坛| 盐源县| 洛阳市| 彭山县| 上犹县| 天柱县|