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 } 
复制代码

 

posted @   油腻老张  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示