对&3代码进行测试
//自定义数据类型
typedef struct PERSON
{
//创建链表
char name[50];
int age;
int score;
}Person;
void MyPrint(void *data)
{
Person *p=(Person *)data;
printf("Name:%s;Age:%d,Score:%d\n",p->name,p->age,p->score);
}
void test01()
{
//创建列表
LinkList *list=Init_LinkList();
//创建数据
Person p1={"ggj",22,100};
Person p2={"wjy",21,98};
Person p3={"zqx",23,96};
Person p4={"lx",21,96};
Person p5={"xxr",21,96};
//把数据插入链表
insert_LinkList(list,0,&p1);
insert_LinkList(list,0,&p2);
insert_LinkList(list,0,&p3);
insert_LinkList(list,0,&p4);
insert_LinkList(list,0,&p5);
//打印
PrintLinkList(list,MyPrint);
//销毁链表
FreeSpace_LinkList(list);
}
int main(void)
{
test01();
getch();
return 0;
}
``测试结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2b2baf6214194761855425c25ba35f46.png)
`代码解释:
//自定义数据类型
定义用户传入信息的结构体
```cpp
typedef struct PERSON
{
//创建链表
char name[50];
int age;
int score;
}Person;
```//创建链表
```cpp
LinkList *list=Init_LinkList();
创建链表函数
//NULL头文件是stdlib
//return NULL;
LinkList *list=(LinkList*)malloc(sizeof(LinkList));
list->size=0;
//头结点是不保存任何信息的,它的出现是让我们少讨论多种情况
list->head=(LinkNode*)malloc(sizeof(LinkNode));
//初始化头结点
list->head->data=NULL;
list->head->next=NULL;
return list;
//创建数据
Person p1={"ggj",22,100};
Person p2={"wjy",21,98};
Person p3={"zqx",23,96};
Person p4={"lx",21,96};
Person p5={"xxr",21,96};
//把数据插入链表
insert_LinkList(list,0,&p1);
insert_LinkList(list,0,&p2);
insert_LinkList(list,0,&p3);
insert_LinkList(list,0,&p4);
insert_LinkList(list,0,&p5);
```//将这些信息插入对用插入函数
//指定位置插入
```cpp
void insert_LinkList(LinkList *list,int pos,void *data)
{
if(list==NULL)
{
return;
}
if(data==NULL)
{
return;
}
//友好处理,pos越界
if(pos<0||pos>list->size)
{
pos=list->size;
}
//创建新的结点
LinkNode *newnode=(LinkNode*)malloc(sizeof(LinkNode));
newnode->data=data;
newnode->next=NULL;
//结点已经创建好,所以我现在要链接起来到链表结构体
//栈结点
//辅助指针变量
LinkNode *pCurrent=list->head;
for(int i=0;i<pos;i++)
{
pCurrent=pCurrent->next;
}
//新节点接入链表
newnode->next=pCurrent->next;
pCurrent->next=newnode;
list->size++;
}
//删除指定位置的值
RemoveByPos_LinkList(list,1);
```![在这里插入图片描述](https://img-blog.csdnimg.cn/7762a091415942a38e3ebbe06c22ba27.png)
对用函数:
```cpp
//删除指定位置的值
void RemoveByPos_LinkList(LinkList *list,int pos)
{
if(list==NULL)
{
return;
}
//删除无法做友好处理,pos越界
if(pos<0||pos>list->size)
{
return;
}
//删除节点的前一个节点
LinkNode *pCurrent=list->head;
for(int i=0;i<pos;i++)
{
//通过这种方式找到我们所需要的结点位置
pCurrent=pCurrent->next;
}
//缓存删除节点
LinkNode *pDel=pCurrent->next;
pCurrent->next=pDel->next;
//把整个内存释放
free(pDel);
list->size--;
}
```//销毁链表就是把链表申请的内存释放
```cpp
//释放链表内存
void FreeSpace_LinkList(LinkList *list)
{
if(list==NULL)
{
return;
}
//辅助指针变量
LinkNode *newnode=list->head;
while(newnode!=NULL)
{
//这样释放结点会导致你先前释放掉找不到了,无法找到下一个结点
//free(newnode);
//newnode=newnode->next;
//所以缓存下一个结点
LinkNode *pNext=list->head->next;
free(newnode);
newnode=pNext;
}
//释放链表占内存
free(list);
}
```cpp
``` printf("链表长度为%d\n",size);
PrintLinkList(list,MyPrint);
Person *ret=(Person *)Front_LinkList(list);
printf("链表第一个元素的数据为Name:%s;Age:%d,Score:%d\n",ret->name,ret->age,ret->score);
```cpp对应函数
```void *Front_LinkList(LinkList *list)
{
return list->head->next->data;
}
有问题请联系qq:2832352904