适应类型:删除的元素不相邻。
每次都需要从 链表头 遍历到 链表尾,去寻找重复元素。
用双层循环去实现,外层循环遍历链表,内层循环将 当前结点的值 与 剩余的所有结点的值 比较
如果有相同的就删除
同时 把删除结点的 前 后 两个节点连接起来。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct NUM {//定义一个结构体
int num;
struct NUM* pNext;
} num, * pnum;
//该子函数 是尾插法
void insert(pnum* phead, pnum* ptail, int Input) {
pnum pnew = (pnum)calloc(sizeof(num), 1);
memset(pnew, 0, sizeof(num));
pnew->num = Input;
if (NULL == *phead) { //判断链表是否为空
//如果链表为空
*phead = pnew;
*ptail = pnew;
}
else {
(*ptail)->pNext = pnew;
*ptail = pnew;
}
}
//打印链表
void printList(pnum phead) {
pnum pcur = phead;
while (pcur) {
printf("%d ",pcur->num);
pcur=pcur->pNext;
}
printf("\n");
}
int main() {
pnum phead = NULL;
pnum ptail = NULL;
pnum pre = NULL;//存储第一个结点地址
pnum pcur = NULL;//存储当前结点地址
pnum next = NULL;//存储下一个结点地址
//pnum q;
int InPut;//定义要输入的数
while (scanf_s("%d", &InPut) != EOF) {//读取要输入的数字
insert(&phead, &ptail, InPut);//调用子函数 在子函数中具体实现功能
}
pcur = phead;
while (pcur) {
pre = pcur;
next = pcur->pNext;//结构体得到下一个结点
while (next) {
if (pcur->num == next->num) {
pre->pNext = next->pNext;
}
else {
pre = next;
}
next = next->pNext;
}
pcur = pcur->pNext;
}
printList(phead);
return 0;
}
运行结果:
重复的元素是 2 ,因此 删除一个2