#pragma once
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#pragma warning(disable:4996)
//建立小节点
typedef struct LinkNode
{
struct LinkNode *next;
};
//建立链表
typedef struct LinkList
{
int size;
LinkNode head;
};
//打印函数指针
typedef void (*PRINTNODE)(LinkNode*);
//初始化
LinkList* Init_LinkList();
//插入
void Insert_LinkList(LinkList* list, int pos, LinkNode* data);
//删除
void Remove_LinkList(LinkList*list, int pos);
//释放链表
void Free_LinkList(LinkList* list);
//打印
int Print_LinkList(LinkList* list, PRINTNODE print);
//查找
int Find_LinkList(LinkList* list, LinkNode* data);
//获取链表长度
int Size_LinkList(LinkList* list);
#include"LINKLIST.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*****************
* 使用企业链表,不用新建节点
* 企业链表是内核链表的改进版
* 内核链表的节点是在下面,企业链表的节点在上面
* ********
* 把节点放下面,不容易找到指针域next,没都要考虑偏移问题,需要自己计算
******************/
//初始化
LinkList* Init_LinkList()
{
//申请动态内存
LinkList* list = (LinkList*)malloc(sizeof(LinkList));
//初始化
list->head.next = NULL;
int size = 0;
return list;
}
//插入
void Insert_LinkList(LinkList* list, int pos, LinkNode* data)
{
if (list == NULL)
{
return;
}
if (data == NULL)
{
return;
}
//越界
if (pos<0 || pos>list->size)
{
pos=list->size;
}
//查找插入位置
LinkNode* pCurrect = &(list->head);
for (int i = 0; i < pos; i++)
{
pCurrect = pCurrect->next;
}
//接入链表
data->next = pCurrect->next;
pCurrect->next = data;
list->size++;
}
//删除
void Remove_LinkList(LinkList* list, int pos)
{
if (list == NULL)
{
return;
}
//越界
if (pos <0||pos>=list->size)
{
return ;
}
//查找位置
LinkNode* pCurrect = &(list->head);
for (int i = 0; i < pos; i++)
{
pCurrect = pCurrect->next;
}
//删除节点
pCurrect->next=pCurrect->next->next;
list->size--;
}
//释放链表
void Free_LinkList(LinkList* list)
{
if (list == NULL)
{
return;
}
free(list);
list->size = 0;
}
//打印
int Print_LinkList(LinkList* list, PRINTNODE print)
{
if (list == 0)
{
return -1;
}
LinkNode* pCurrect = list->head.next;
while (pCurrect != NULL)
{
print(pCurrect);
pCurrect = pCurrect->next;
}
}
//查找
int Find_LinkList(LinkList* list, LinkNode* data)
{
if (list == NULL)
{
return -1;
}
if (data == NULL)
{
return -1;
}
//辅助指针变量
LinkNode* pCurrect = list->head.next;
int i = 0;
while (pCurrect != NULL)
{
if (pCurrect != NULL)
{
break;
}
i++;
pCurrect = pCurrect->next;
}
return i;
}
//获取链表长度
int Size_LinkList(LinkList* list)
{
return list->size;
}
#include"LINKLIST.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Person
{
LinkNode node;
char name[64];
int age;
}Person;
void Myprint(LinkNode* data)
{
Person* p = (Person*)data;
printf("姓名:%s 年龄:%d\n ", p->name, p->age);
}
int main()
{
//初始化
LinkList* list = Init_LinkList();
//创建数据
Person p1, p2, p3;
strcpy(p1.name, "aaa");
strcpy(p2.name, "bbb");
strcpy(p3.name, "ccc");
p1.age = 13;
p2.age = 15;
p3.age = 14;
//插入数据
Insert_LinkList(list, 0, (LinkNode*)&p1);
Insert_LinkList(list, 0, (LinkNode*)&p2);
Insert_LinkList(list, 0, (LinkNode*)&p3);
Print_LinkList(list, Myprint);
printf("----------------------------\n");
Remove_LinkList(list, 0);
Print_LinkList(list, Myprint);
Free_LinkList(list);
}