13单向链表
Posted 乱丶心
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了13单向链表相关的知识,希望对你有一定的参考价值。
头文件:LinkList.h
1 #ifndef LINKLIST_H 2 #define LINKLIST_H 3 4 #include<stdio.h> 5 #include<stdlib.h> 6 #include<string.h> 7 //链表结点 8 typedef struct LINKNODE{ 9 void* data;//无类型指针,可以指向任何类型数据 10 struct LINKNODE* next; 11 }LinkNode; 12 //链表结构体 13 typedef struct LINKLIST { 14 LinkNode* head; 15 int size; 16 //需要容量吗?不需要,链表是根据所需去申请内存 17 }LinkList; 18 19 //打印函数指针 20 typedef void(*PRINTLINKNODE)(void*); 21 22 23 //初始化链表 24 LinkList* Init_LinkList(); 25 //指定位置插入 26 void Insert_LinkList(LinkList* list,int pos,void* data); 27 //删除指定位置的值 28 void RemoveByPos_LinkList(LinkList* list, int pos); 29 //返回链表的长度 30 int Size_LinkList(LinkList* list); 31 //查找 32 int Find_LinkList(LinkList* list,void* data); 33 //返回第一个结点 34 void*Front_LinkList(LinkList* list); 35 //打印链表结点 36 void Print_LinkList(LinkList* list, PRINTLINKNODE print); 37 //释放链表内存 38 void FreeSpace_LinkList(LinkList* list); 39 40 #endif
LinkList.c
1 #include"LinkList.h" 2 3 4 //初始化链表 5 LinkList* Init_LinkList() { 6 7 LinkList* list = (LinkList*)malloc(sizeof(LinkList)); 8 list->size = 0; 9 //头结点 不保存数据信息 10 list->head = (LinkNode*)malloc(sizeof(LinkNode)); 11 list->head->data = NULL; 12 list->head->next = NULL; 13 14 return list; 15 16 } 17 //指定位置插入 18 void Insert_LinkList(LinkList* list, int pos, void* data) { 19 if (list == NULL) { 20 return; 21 } 22 if (data == NULL) { 23 return; 24 } 25 //判断,pos越界 26 if (pos<0||pos>list->size) { 27 pos = list->size; 28 } 29 //创建新的结点 30 LinkNode* newnode = (LinkNode*)malloc(sizeof(LinkNode)); 31 newnode->data = data; 32 newnode->next = NULL; 33 34 //找结点 35 //辅助指针变量 36 LinkNode* pCurrent = list->head; 37 for (int i = 0; i < pos; i++) { 38 pCurrent = pCurrent->next; 39 } 40 41 //新结点入链表 42 newnode->next = pCurrent->next; 43 pCurrent->next = newnode; 44 45 list->size++; 46 } 47 //删除指定位置的值 48 void RemoveByPos_LinkList(LinkList* list, int pos) { 49 50 if (list==NULL) { 51 return; 52 } 53 if(pos<0 || pos>=list->size) 54 { 55 return; 56 } 57 //查找删除结点的前一个结点 58 LinkNode* pCurrent = list->head; 59 for (int i = 0; i < pos; i++) { 60 pCurrent = pCurrent->next; 61 } 62 63 //缓存删除的结点 64 LinkNode* pDel = pCurrent->next; 65 pCurrent->next = pDel->next; 66 //释放删除结点的内存 67 free(pDel); 68 69 list->size--; 70 71 } 72 //返回链表的长度 73 int Size_LinkList(LinkList* list) { 74 75 return list->size; 76 } 77 //查找 78 int Find_LinkList(LinkList* list, void* data) { 79 if (list == NULL) { 80 return -1; 81 } 82 if (data == NULL) { 83 return -1; 84 } 85 //遍历查找 86 LinkNode* pCurrent = list->head->next;//指向第一个有效数字 87 int i = 0; 88 while (pCurrent !=NULL) 89 { 90 if (pCurrent->data == data) { 91 break; 92 } 93 i++; 94 pCurrent = pCurrent->next; 95 } 96 97 return i; 98 } 99 //返回第一个结点 100 void* Front_LinkList(LinkList* list) { 101 102 return list->head->next->data; 103 } 104 //打印链表结点 105 void Print_LinkList(LinkList* list, PRINTLINKNODE print) { 106 if (list==NULL) { 107 return; 108 } 109 //辅助指针变量 110 LinkNode* pCurrent = list->head->next; 111 while (pCurrent != NULL) { 112 print(pCurrent->data); 113 pCurrent = pCurrent->next; 114 } 115 116 } 117 //释放链表内存 118 void FreeSpace_LinkList(LinkList* list) { 119 if (list == NULL) { 120 return; 121 } 122 //辅助指针变量 123 LinkNode* pCurrent = list->head; 124 while (pCurrent != NULL) { 125 //缓存下一个结点 126 LinkNode* pNext = pCurrent->next; 127 free(pCurrent); 128 pCurrent = pNext; 129 } 130 //释放链表内存 131 list->size = 0; 132 free(list); 133 }
main.c
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include"LinkList.h" 6 7 //自定义数据类型 8 typedef struct PERSON { 9 char name[64]; 10 int age; 11 int score; 12 }Person; 13 //打印函数 14 void MyPrint(void* data) { 15 Person* p = (Person*)data; 16 printf("Name:%s Age:%d Score:%d\\n",p->name,p->age,p->score); 17 } 18 19 int main() 20 { 21 //创建一个链表 22 LinkList* list = Init_LinkList(); 23 24 //创建数据 25 Person p1 ={ "aaa",18,100 }; 26 Person p2 = { "bbb",19,99 }; 27 Person p3 = { "ccc",20,98 }; 28 Person p4 = { "ddd",21,70 }; 29 Person p5 = { "eee",22,59 }; 30 //数据插入链表 31 Insert_LinkList(list, 0, &p1); 32 Insert_LinkList(list, 0, &p2); 33 Insert_LinkList(list, 0, &p3); 34 Insert_LinkList(list, 0, &p4); 35 Insert_LinkList(list, 0, &p5); 36 37 //打印链表 38 Print_LinkList(list, MyPrint); 39 40 //删除3 41 RemoveByPos_LinkList(list, 3); 42 43 //打印 44 printf("--------------------------\\n"); 45 Print_LinkList(list, MyPrint); 46 47 //返回第一个结点 48 printf("-----查找结果---------\\n"); 49 Person* ret = (Person*)Front_LinkList(list); 50 printf("Name:%s Age:%d Score:%d\\n", ret->name, ret->age, ret->score); 51 52 53 54 55 //销毁链表 56 FreeSpace_LinkList(list); 57 58 59 system("pause"); 60 return 0; 61 }
VS2015运行结果
以上是关于13单向链表的主要内容,如果未能解决你的问题,请参考以下文章