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("\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

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值