C语言 - 基础数据结构和算法 - 企业链表
听黑马程序员教程《基础数据结构和算法 (C版本)》,照着老师所讲抄的,
视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1
喜欢的朋友可以去看看,欢迎大家一起交流学习。
03 企业链表
1 #include<stdio.h > 2 #include<stdlib.h> 3 #include<string.h> 4 5 // 链表小结点 6 typedef struct LINKNODE{ 7 struct LINKNODE* next; 8 }LinkNode; 9 10 // 链表结点 11 typedef struct LINKLIST{ 12 LinkNode head; 13 int size; 14 }LinkList; 15 16 // 自定义数据结构 17 typedef struct PERSON{ 18 LinkNode node; // 相当于 next 。 19 char name[32]; 20 int age; 21 }Person; 22 23 // 打印回调 24 void myPrint(LinkNode* data){ 25 Person* p = (Person*)data; 26 printf("姓名:%s\t年龄:%d\n", 27 p->name,p->age); 28 } 29 // 查找的回调函数 30 int myCompare(LinkNode* node1,LinkNode* node2){ 31 Person* p1 = (Person*)node1; 32 Person* p2 = (Person*)node2; 33 if(strcmp(p1->name,p2->name)==0 && p1->age==p2->age){ 34 return 1; 35 } 36 return -1; 37 } 38 // --------------------------- 功能函数 ---------------------- 39 40 // 打印回调 41 typedef void(*PRINTNODE)(LinkNode*); 42 // 比较函数指针 43 typedef int(*COMPARENODE)(LinkNode*,LinkNode*); 44 45 // 初始化链表,返回一个链表 46 LinkList* Init_LinkList(); 47 48 // 插入节点 49 void Insert_LinkList(LinkList* list,int pos,LinkNode* data); 50 51 // 删除节点 52 void Remove_LinkList(LinkList* list,int pos); 53 54 // 查找 55 int Find_LinkList(LinkList* list,LinkNode* data,COMPARENODE compare); 56 57 // 返回链表节点数量 58 int Size_LinkList(LinkList* list); 59 60 // 打印 61 void Print_LinkList(LinkList* list,PRINTNODE print); 62 63 // 释放内存 64 void FreeSpace_LinkList(LinkList* List); 65 66 int main(){ 67 printf("好好学习,天天向上~!\t\t企业链表20220603\n\n\n"); 68 69 // 创建链表 70 LinkList* list = Init_LinkList(); 71 // 创建数据 72 Person p1,p2,p3,p4,p5; 73 strcpy(p1.name,"aaa1"); 74 strcpy(p2.name,"bbb2"); 75 strcpy(p3.name,"ccc3"); 76 strcpy(p4.name,"ddd4"); 77 strcpy(p5.name,"eee5"); 78 p1.age = 10; 79 p2.age = 13; 80 p3.age = 15; 81 p4.age = 16; 82 p5.age = 20; 83 84 // 将节点插入到链表 85 Insert_LinkList(list,0,(LinkNode*)&p1); 86 Insert_LinkList(list,0,(LinkNode*)&p2); 87 Insert_LinkList(list,0,(LinkNode*)&p3); 88 Insert_LinkList(list,0,(LinkNode*)&p4); 89 Insert_LinkList(list,0,(LinkNode*)&p5); 90 91 // 打印 92 Print_LinkList(list,myPrint); 93 94 // 删除结点 95 printf("\n删除第3个结点后,\n"); 96 Remove_LinkList(list,3); 97 // 打印 98 Print_LinkList(list,myPrint); 99 100 // 查找 101 Person temp; 102 strcpy(temp.name,"ccc3"); 103 temp.age= 18; 104 int pos = Find_LinkList(list,(LinkNode*)&temp,myCompare); 105 printf("查找结点的位置为:%d\n\n",pos); 106 107 // 释放内存 108 FreeSpace_LinkList(list); 109 return 0; 110 } 111 112 // --------------------------- 功能函数 实现 ---------------------- 113 114 // 初始化链表,返回一个链表 115 LinkList* Init_LinkList(){ 116 LinkList * list = (LinkList*)malloc(sizeof(LinkList)); 117 list->head.next = NULL; 118 list->size = 0; 119 return list; 120 } 121 122 // 插入节点 123 void Insert_LinkList(LinkList* list,int pos,LinkNode* data){ 124 if(list==NULL){ 125 return ; 126 } 127 if(data==NULL){ 128 return; 129 } 130 if(pos<0 || pos > list->size){ 131 pos = list->size; 132 } 133 // 查找插入位置 134 int i; 135 LinkNode* pCurrent = &(list->head); 136 for(i =0;i<pos;i++){ 137 pCurrent = pCurrent->next; 138 } 139 // 插入新节点 140 data->next = pCurrent->next; 141 pCurrent->next = data; 142 143 list->size++; 144 } 145 146 // 删除节点 147 void Remove_LinkList(LinkList* list,int pos){ 148 if(list==NULL){ 149 return ; 150 } 151 if(pos<0 || pos > list->size){ 152 return; 153 } 154 // 查找要删除节点的位置 155 int i; 156 LinkNode* pCurrent = &(list->head); 157 for(i =0;i<pos;i++){ 158 pCurrent = pCurrent->next; 159 } 160 pCurrent->next = pCurrent->next->next; 161 list->size--; 162 } 163 164 // 查找,返回结点地址(指针) 165 int Find_LinkList(LinkList* list,LinkNode* data,COMPARENODE compare){ 166 if(list==NULL){ 167 return ; 168 } 169 if(data==NULL){ 170 return; 171 } 172 // 辅助指针变量 173 int i=0; 174 int flag=-1; 175 LinkNode* pCurrent = list->head.next; 176 while(pCurrent){ 177 if(compare(pCurrent,data)==1){ 178 flag = i; 179 break; 180 } 181 i++; 182 pCurrent = pCurrent->next; 183 } 184 return flag; 185 } 186 187 // 返回链表节点数量 188 int Size_LinkList(LinkList* list){ 189 return -1; 190 } 191 192 // 打印 193 void Print_LinkList(LinkList* list,PRINTNODE print){ 194 if(list==NULL){ 195 return ; 196 } 197 // 辅助指针 198 LinkNode* pCurrent = list->head.next; 199 while(pCurrent){ 200 print(pCurrent); 201 pCurrent = pCurrent->next; 202 } 203 } 204 205 // 释放内存 206 void FreeSpace_LinkList(LinkList* list){ 207 if(list==NULL){ 208 return ; 209 } 210 }
本文来自博客园,作者:油腻老张,转载请注明原文链接:https://www.cnblogs.com/stou/p/16343744.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律