#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int data;
int lenth;
struct Node* next;
}Node_t;
//开辟空间+初始化
Node_t* AollocNode(int x)
{
Node_t* p = (Node_t*)malloc(sizeof(Node_t));
if (p == NULL)//检测是否开辟成功
{
perror("molloc");
}
p->data = x;
p->next = NULL;
return p;
}
//尾插法创建链表 2
void TailCreatList(Node_t** pend)
{
int i = 0;
int x = 0;
int n = 0;
printf("请输入初始化链表的个数");
scanf("%d", &n);
(*pend)->lenth = n;
for (i = 0; i < n; i++)
{
scanf("%d", &x);
Node_t* p = AollocNode(x);
(*pend)->next = p;
*pend = p;
}
}
//打印链表
void ShowList(Node_t* head)
{
Node_t* p = head->next;
while (p)
{
printf("%d->", p->data);
p = p->next;
}
printf("NULL\n");
}
void DeReList(Node_t** phead)
{
if ((*phead)->next == NULL)//对第一个节点进行判断
{
return;
}
Node_t* p = (*phead)->next->next;//指向第二个节点
Node_t* p1 = (*phead)->next;//p的前驱
Node_t* p2 = (*phead);//p1的前驱
int flag = 1;
int bedata = 0;//记录重复的数据
while (p)
{
flag = 1;
if (p->data == p1->data || bedata == p1->data)
{
//用p4释放节点每次释放一个,p1,p指向后面的节点
Node_t* p4 = p1;
bedata = p1->data;
//1 1 1 2
p1 = p1->next;
p = p1->next;
p2->next = p1;
free(p4);
flag = 0;
}
if (flag)
{
p = p->next;
p1 = p1->next;
p2 = p2->next;
}
}
//判断最后一个节点是否是重复的
if (p1->data == bedata)
{
p2->next = p1->next;
free(p1);
}
}
int main()
{
Node_t* head = AollocNode(0);
Node_t* end = head;
//尾插入创建
TailCreatList(&end);//第二个图片是这个没有调用
DeReList(&head);
ShowList(head);
free(head);
return 0;
}