链式存储定义:
为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本省的信息外,还需要存储指示其直接后继的信息。
链式存储逻辑结构:
n个结点链接成一个链式线性表的结构叫做链表,当每个节点中只包含一个指针域时叫单链表。
国嵌实现的是可复用的链表,和大多数书上实现的代码结构不一样。他实现的结构体里面只有一个指针,当你实现链表时,把什么链表头,链表元素,统统强制转换LinkListNode*,但要保证每个结构中都有LinkListNode* next成员。
typedef void LinkList; typedef struct _tag_LinkListNode LinkListNode; struct _tag_LinkListNode { LinkListNode* next; };
实现代码:
头文件定义:
#ifndef __LISTLINK_H_ #define __LISTLINK_H_ typedef void LinkList; typedef struct _tag_LinkListNode LinkListNode; struct _tag_LinkListNode { LinkListNode* next; }; LinkList* LinkList_Create(); void LinkList_Destory(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
c实现文件:
#include <stdio.h> #include <malloc.h> #include "LinkList.h" typedef struct _tag_LinkList { LinkListNode header; //结构体的首地址 int Length; }TLinkList; /* 创建一个头结点 */ LinkList* LinkList_Create()//O(1) { TLinkList *ret = (TLinkList*)malloc(sizeof(TLinkList)); if(ret != NULL) { ret->Length = 0; ret->header.next = NULL; } return ret; } /* 释放链表 */ void LinkList_Destory(LinkList* list)//O(1) { free(list); } /* 链表清空 */ void LinkList_Clear(LinkList* list)//O(1) { TLinkList *sList = (TLinkList*)list; if(sList != NULL) { sList->Length = 0; sList->header.next = NULL; } } /* 得到链表长度 */ int LinkList_Length(LinkList* list)//O(1) { TLinkList *sList = (TLinkList*)list; int ret = -1; if(sList != NULL) { ret = sList->Length; } return ret; } /* 链表的插入 */ int LinkList_Insert(LinkList *list,LinkListNode *node,int pos)//O(n) { TLinkList *sList = (TLinkList*)list; int ret = (sList != NULL)&&(pos >= 0)&&(node != NULL); int i; if( ret ) { LinkListNode *current = (LinkListNode*)sList; for(i=0; (i<pos)&&(current->next != NULL); i++) { current = current->next; } node->next = current->next; current->next = node; sList->Length++; } return ret; } /* 链表的查找 */ LinkListNode *LinkList_Get(LinkList* list,int pos)//O(n) { TLinkList *sList = (TLinkList*)list; LinkListNode *ret = NULL; int i; if( (0<=pos) && (sList != NULL) &&(pos < sList->Length)) { LinkListNode *current = (LinkListNode*)sList; for(i=0; (i<pos); i++) { current = current->next; } ret = current->next; } return ret; } /* 单链表的删除 */ LinkListNode *LinkList_Delete(LinkList *list,int pos)//O(n) { TLinkList *sList = (TLinkList*)list; LinkListNode *ret = NULL; int i; if( (0<=pos) && (sList != NULL) &&(pos < sList->Length)) { LinkListNode *current = (LinkListNode*)sList; for(i=0; (i<pos); i++) { current = current->next; } ret = current->next; current->next = ret->next; sList->Length--; } return ret; }
测试代码:
#include <stdio.h> #include <stdlib.h> #include "LinkList.h" struct Value { LinkListNode* header; int value; }; int main(void) { int i = 0; LinkList* list = LinkList_Create(); struct Value v1; struct Value v2; struct Value v3; struct Value v4; struct Value v5; v1.value = 1; v2.value = 2; v3.value = 3; v4.value = 4; v5.value = 5; /*//头插法 LinkList_Insert(list,(LinkListNode*)&v1,0); LinkList_Insert(list,(LinkListNode*)&v2,0); LinkList_Insert(list,(LinkListNode*)&v3,0); LinkList_Insert(list,(LinkListNode*)&v4,0); LinkList_Insert(list,(LinkListNode*)&v5,0); */ //尾插法 LinkList_Insert(list,(LinkListNode*)&v1,LinkList_Length(list)); LinkList_Insert(list,(LinkListNode*)&v2,LinkList_Length(list)); LinkList_Insert(list,(LinkListNode*)&v3,LinkList_Length(list)); LinkList_Insert(list,(LinkListNode*)&v4,LinkList_Length(list)); LinkList_Insert(list,(LinkListNode*)&v5,LinkList_Length(list)); for(i=0; i<LinkList_Length(list);i++) { struct Value* pv = (struct Value*)LinkList_Get(list,i); printf("%d\n",pv->value); } printf("删除:\n"); struct Value* ret = (struct Value*)LinkList_Delete(list,1); printf("%d\n",ret->value); printf("\n"); for(i=0; i<LinkList_Length(list);i++) { struct Value* pv = (struct Value*)LinkList_Get(list,i); printf("%d\n",pv->value); } LinkList_Destory(list); printf("Press any key to continue"); getchar(); return 0; }