设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); //打印删除结点之后的链表
}