线性表链式存储结构
与传统链表不同的是,业务节点Student首地址与node首地址重叠,底层并不关心业务节点Student如何,只负责把node节点串起来。链表算法与具体业务节点分离!
参考C语言代码(附调试代码):
linear_linklist.c文件(上层应用):
#include <stdlib.h> #include <string.h> #include <stdio.h> #include "linklist.h" typedef struct { LinkListNode Node;//Student和node首地址重叠 int age; char name[64]; }Student; //这个是业务节点 void main() { int i = 0; Student s1, s2, s3, s4; LinkList* list = NULL; s1.age = 18; s2.age = 19; s3.age = 20; s4.age = 21; list = LinkList_Create(); if (list == NULL) { return; } //链表算法与具体业务节点分离 LinkList_Insert(list, (LinkListNode *)&s1, 0); /*注意,业务节点Student首地址与node首地址重叠,所以可以摆&s1强制转换为LinkListNode型, 底层并不关心业务节点Student如何,只负责把node节点串起来*/ LinkList_Insert(list, (LinkListNode *)&s2, 0); LinkList_Insert(list, (LinkListNode *)&s3, 0); LinkList_Insert(list, (LinkListNode *)&s4, 0); //遍历 for (i = 0; i<LinkList_Length(list); i++) { Student *tmp = (Student *)LinkList_Get(list, i); if (tmp != NULL) { printf("age:%d ", tmp->age); } } printf("\n"); LinkList_Delete(list, 2); /*while (LinkList_Length(list) > 0) { Student *tmp = (Student *)LinkList_Delete(list, 0); if (tmp != NULL) { printf("age:%d ", tmp->age); } }*/ for (i = 0; i<LinkList_Length(list); i++) { Student *tmp = (Student *)LinkList_Get(list, i); if (tmp != NULL) { printf("age:%d ", tmp->age); } } LinkList_Destroy(list); system("pause"); }
linklist.h文件(头文件):
1 #ifndef _MYLINKLIST_H_ 2 #define _MYLINKLIST_H_ 3 typedef void LinkList; 4 typedef struct _tag_LinkListNode 5 { 6 struct _tag_LinkListNode* next; 7 }LinkListNode; 8 /*这个小节点什么事都不做,没有业务数据,就是用来被(Student)包含的*/ 9 LinkList* LinkList_Create(); 10 void LinkList_Destroy(LinkList* list); 11 void LinkList_Clear(LinkList* list); 12 int LinkList_Length(LinkList* list); 13 int LinkList_Insert(LinkList* list, LinkListNode* node, int pos); 14 LinkListNode* LinkList_Get(LinkList* list, int pos); 15 LinkListNode* LinkList_Delete(LinkList* list, int pos); 16 #endif
linklist.c文件(底层库)
1 #include <stdlib.h> 2 #include <string.h> 3 #include <stdio.h> 4 #include "linklist.h" 5 /*Create函数返回一个句柄,所以在底层库要有一个结构体*/ 6 typedef struct _tag_LinkList 7 { 8 LinkListNode header; 9 int length; 10 }S_LinkList; 11 /*这个负责把节点串起来*/ 12 LinkList* LinkList_Create() 13 { 14 S_LinkList* ret = NULL; 15 ret = (S_LinkList*)malloc(sizeof(S_LinkList)); 16 if (ret == NULL) 17 { 18 return NULL; 19 } 20 //memset(ret, 0, sizeof(S_LinkList)); 21 ret->length = 0; 22 ret->header.next = NULL; 23 return ret; 24 } 25 void LinkList_Destroy(LinkList* list) 26 { 27 if (list == NULL) 28 { 29 return; 30 } 31 free(list); 32 return; 33 } 34 void LinkList_Clear(LinkList* list) 35 { 36 S_LinkList* ret=NULL; 37 if (list == NULL) 38 { 39 return; 40 } 41 ret = (S_LinkList*)list; 42 ret->length = 0; 43 ret->header.next = NULL; 44 return; 45 } 46 int LinkList_Length(LinkList* list) 47 { 48 S_LinkList* ret = NULL; 49 if (list == NULL) 50 { 51 return 0; 52 } 53 ret = (S_LinkList*)list; 54 return ret->length; 55 } 56 int LinkList_Insert(LinkList* list, LinkListNode* node, int pos) 57 { 58 LinkListNode* current = NULL;//current辅助指针变量 59 S_LinkList* s_list; 60 int ret = 0,i=0; 61 if (list == NULL || node == NULL || pos < 0) 62 { 63 printf("func LinkList_Insert err:%d\n", ret); 64 return ret; 65 } 66 s_list = (S_LinkList*)list; 67 current = &(s_list->header); 68 for (i = 0; i<pos && (current->next != NULL); i++) 69 { 70 current = current->next; 71 } 72 node->next = current->next; 73 current->next = node; 74 s_list->length++; 75 ret = 1; 76 return ret; 77 } 78 LinkListNode* LinkList_Get(LinkList* list, int pos) 79 { 80 LinkListNode* current = NULL;//current辅助指针变量 81 S_LinkList* s_list; 82 int ret = 0, i = 0; 83 if (list == NULL || pos < 0) 84 { 85 printf("func LinkList_Insert err:%d\n", ret); 86 return NULL; 87 } 88 s_list = (S_LinkList*)list; 89 current = &(s_list->header); 90 for (i = 0; i<pos && (current->next != NULL); i++) 91 { 92 current = current->next; 93 } 94 return current->next; 95 } 96 LinkListNode* LinkList_Delete(LinkList* list, int pos) 97 { 98 LinkListNode* current = NULL;//current辅助指针变量 99 LinkListNode* ret = NULL;//ret辅助指针变量来缓存被删除的节点位置 100 S_LinkList* s_list; 101 int i = 0; 102 if (list == NULL || pos < 0) 103 { 104 printf("func LinkList_Insert err:%d\n", ret); 105 return NULL; 106 } 107 s_list = (S_LinkList*)list; 108 current = &(s_list->header); 109 for (i = 0; i<pos && (current->next != NULL); i++) 110 { 111 current = current->next; 112 } 113 ret = current->next;//ret辅助指针变量来缓存被删除的节点位置 114 current->next = ret->next; 115 s_list->length--; 116 return ret; 117 }

浙公网安备 33010602011771号