删除链表中值重复的结点

设head指向一个非空单向链表,数据域值重复且无序,删除重复结点

例如原链表中数据域值为3->2->3->8->4->3->4->9->2->3

删除重复值后链表数据域值为3->2->8->4->9

代码如下:

#include<stdio.h>
#include<stdlib.h> 
#define N 10
typedef struct node{
	int data;
	struct node* next;
}ElemSN;

//创建一个单向链表 
ElemSN* CreatLink(int a[],int n)
{
	ElemSN *head,*tail,*p;
	head=NULL;
	for(int i=0;i<n;i++)
	{
		p=(ElemSN*)malloc(sizeof(ElemSN));
		p->data=a[i];
		p->next=NULL;
		if(!head)
	    {
	    	head=tail=p;
	    	tail->next=NULL;
		}
	    else
	    {
	    	tail=tail->next=p;
	    	tail->next=NULL;
		}
	}
	return head;
 } 
 
 
 //删除重复值
 ElemSN* DelSameNode(ElemSN *head)
 {
 	ElemSN *Pkey,*p,*q;
 	Pkey=head;
 	while(Pkey)
 	{
 		q=Pkey;
 		p=Pkey->next;
 		while(p)
 		{
 		    if(p->data-Pkey->data)
 	    	{
 			    q=p;
 			    p=p->next;
	    	}
		    else
		    {
		    	q->next=p->next;
				p=q->next;	
			}
		 }
		 Pkey=Pkey->next;
	}
	return head;
 } 
 
   //打印删除结点后的链表  
  void PrintLink(ElemSN* head)
 {
 	ElemSN *p=head;
 	for(;p;p=p->next)
 	printf("%5d",p->data);
 }
 
 int main(void)
 {
 	ElemSN *head;
 	int a[N]={3,2,3,8,4,3,4,9,2,3};
 	head=CreatLink(a,N);  //创建单向链表,返回头指针
	head=DelSameNode(head);   //删除链表中数据域值重复的结点 
	PrintLink(head);   //打印删除结点之后的链表 
 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值