c语言——删除单链表中的重复元素
适应类型:删除的元素不相邻。
每次都需要从 链表头 遍历到 链表尾,去寻找重复元素。
用双层循环去实现,外层循环遍历链表,内层循环将 当前结点的值 与 剩余的所有结点的值 比较
如果有相同的就删除
同时 把删除结点的 前 后 两个节点连接起来。
#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(" "); } 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