C/C++企业链表的实现
2024-09-21 16:55:02
首先 先介绍企业链表 和Linux内核链表 和 之前我发的一篇单项链表的区别
结构体变量名是结构体的首地址吗? 这个问题会在待会链表实现中体现!!
答案:有些编译器 支持用结构体变量名做地址的方式但一般不推荐,因为非标准
正确的方式是用&变量名比如struct type s;那么s的地址为&s,使用&(取地址运算符) 才能得到结构体的地址。
下面d是代码!!!
#pragma once
#ifndef EnterpriseLinkList
#define EnterpriseLinkList //链表小结点
typedef struct LinkNode
{
struct LinkNode *Next;
}LinkNode; //链表结点
typedef struct LinkList
{
LinkNode head;
int size;
}LinkList; //遍历函数指针
typedef void(*PRINTLINKNODE)(LinkNode *);
//比较函数指针
typedef int(*COMPARENODE)(LinkNode *, LinkNode *); //初始化链表
LinkList *Init_LinkList(); //插入
void Insert_LinkList(LinkList* list, int pos, LinkNode *data); //删除
void Delete_LinkList(LinkList* list, int pos); //获得链表的长度
int Get_LinkList_Length(LinkList* list); //查找
int Find_LinkList_data(LinkList* list, LinkNode *data, COMPARENODE campare); //打印
void Print_LinkList(LinkList* list, PRINTLINKNODE print); //释放链表内存
void Free_LinkList(LinkList* list); #endif // !EnterpriseLinkList
#include"EnterpriseLinkList.h"
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//初始化链表
LinkList *Init_LinkList()
{
LinkList*list = (LinkList*)malloc(sizeof(LinkList));
list->head.Next = NULL;
list->size = ;
return list; } /*//打印函数指针
typedef void(*PRINTLINKNODE)(LinkNode *);*/ //插入
void Insert_LinkList(LinkList* list, int pos, LinkNode *data)
{
if (list == NULL) return;
if (data == NULL) return;
if (pos< || pos > list->size)
{
pos = list->size;
}
//查找插入位置
LinkNode*pCurrent = &(list->head);
for (int i = ; i < pos; i++)
{
pCurrent = pCurrent->Next;
}
//新结点插入
data->Next = pCurrent->Next;
pCurrent->Next = data; list->size++; } //删除
void Delete_LinkList(LinkList* list, int pos)
{
if (list == NULL) return;
if (pos< || pos>=list->size)
{
return;
}
//辅助指针查找(删除的前一个)位置
LinkNode*pCurrent = &(list->head);
for (int i = ; i < pos; i++)
{
pCurrent = pCurrent->Next;
}
//删除结点
pCurrent->Next = pCurrent->Next->Next; list->size--;
} //获得链表的长度
int Get_LinkList_Length(LinkList* list)
{
return list->size;
} //查找
int Find_LinkList_data(LinkList* list, LinkNode *data, COMPARENODE campare)
{
if (list == NULL)
{
printf("list == NULL");
return -;
}
if (data == NULL)
{
printf("data == NULL");
return -;
}
//辅助指针查找
LinkNode*pCurrent = list->head.Next;
int index = ;
int flag = -; while (pCurrent!=NULL)
{
if (campare(pCurrent, data) == )
{
flag = ;
break;
}
pCurrent = pCurrent->Next;
index++;
} if (flag == )
{
printf("\nFound!! ");
return index;
}
else
{ printf("Not found!!\n");
return -;
} } //打印
void Print_LinkList(LinkList* list, PRINTLINKNODE print)
{
if (list == NULL) return;
//定义一个辅助指针
LinkNode*pCurrent = list->head.Next;
while (pCurrent != NULL)
{
print(pCurrent);
pCurrent = pCurrent->Next;
} } //释放链表内存
void Free_LinkList(LinkList* list)
{
if (list == NULL)return;
free(list);
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include"EnterpriseLinkList.h" typedef struct Person
{
LinkNode node;
char name[];
int age;
}Person; void Myprint(LinkNode*data)
{
Person*p = (Person*)data;
printf("name is %s age is %d \n", p->name, p->age);
}
int campare(LinkNode*data1, LinkNode*data2)
{
Person*p1 = (Person*)data1;
Person*p2 = (Person*)data2;
if (p1->age == p2->age && strcmp(p1->name,p2->name)== )
{
return ;
}
else {
return -;
}
} int main(void)
{
//创建链表
LinkList* list = Init_LinkList();
//创建数据
Person p1, p2, p3, p4, p5,p6;
strcpy(p1.name, "aaa");
strcpy(p2.name, "bbb");
strcpy(p3.name, "ZJD");
strcpy(p4.name, "LK");
strcpy(p5.name, "eee");
strcpy(p6.name, "HHH");
p1.age = ;
p2.age = ;
p3.age = ;
p4.age = ;
p5.age = ;
p6.age = ; //将结点插入链表
Insert_LinkList(list,,(LinkNode*)&p1);
Insert_LinkList(list, , (LinkNode*)&p2);
Insert_LinkList(list, , (LinkNode*)&p3);
Insert_LinkList(list, , (LinkNode*)&p4);
Insert_LinkList(list, , (LinkNode*)&p5);
Insert_LinkList(list, , (LinkNode*)&p6); //打印
Print_LinkList(list, Myprint);
//获得链表长度
int Linklist_size;
Linklist_size=Get_LinkList_Length(list);
printf("Linklist_size is %d \n", Linklist_size); //查找
Person zjd;
strcpy(zjd.name,"LK");
zjd.age = ;
printf("\nTo get LK posion wait~~~~");
int posFound = Find_LinkList_data(list, (LinkNode*)&zjd, campare);
printf("\nLK's posion %d\n \n", posFound+); //打印
Print_LinkList(list, Myprint);
//获得链表长度
Linklist_size = Get_LinkList_Length(list);
printf("Linklist_size is %d \n", Linklist_size); //删除结点
int pos;
printf("Enter the posion what you want to delete \n");
scanf("%d", &pos);
Delete_LinkList(list,pos); //打印
Print_LinkList(list, Myprint);
//获得链表长度
Linklist_size = Get_LinkList_Length(list);
printf("Linklist_size is %d \n", Linklist_size); //释放
Free_LinkList(list);
printf("\n");
system("pause");
return ;
}
最新文章
- Spring JavaMail发送邮件
- 大熊君JavaScript插件化开发------(实战篇之DXJ UI ------ ProcessBar)
- 当手机被PS掉,人们看到的是手中的灵魂
- JQuery设置和去除disabled属性
- Spring中Aware相关接口原理
- C#函数、参数数组(例子)★
- JSON 序列化和反序列化&mdash;&mdash;JavaScriptSerializer实现
- UIButton设置imgae图片自适应button的大小且不变形
- BZOJ 1497: [NOI2006]最大获利 最小割
- mongdb Java demo
- Java图像灰度化的实现过程解析
- Apache本地服务无法自启动问题解决
- ES6 JavaScript Promise的感性认知
- Exception in thread ";main"; org.hibernate.HibernateException: save is not valid without active transaction
- 使用Dubbo、JSF等RPC框架时,对于异常的处理
- SSM框架整合,以CRM为例子
- BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏 [Nim游戏 SG函数]
- 集成学习之Boosting —— AdaBoost原理
- java项目引用证书文件(微信支付的p12文件)
- Nginx详解十六:Nginx场景实践篇之缓存服务