解析C++的线性表链式存储设计与相关的API实现
基本概念 表头结点: 链表技术领域推演 链表链式存储_api实现分析: 带头结点、位置从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; } 返回第三个位置的。 删除元素: 代码实例: 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
#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,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,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; // 删除结点 cur->next = ret->next; --tList->length; return ret; }
#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; // 创建链表 Student *list = (Student *)LinkList_Create(); // 插入结点 LinkList_Insert(list,(LinkListNode *)&s1,0); LinkList_Insert(list,(LinkListNode *)&s2,(LinkListNode *)&s3,(LinkListNode *)&s4,(LinkListNode *)&s5,(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: %dn",tmp->age); } // 删除链表结点 while (LinkList_Length(list)) { Student *tmp = (Student *)LinkList_Delete(list,0); if (tmp == NULL) { return 0; } printf("age: %dn",tmp->age); } LinkList_Destroy(list); return 0; } 优点:
缺点:
工程详情:Github (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |