//设数据域的值重复且升序有序,删除链表中的重复值结点
//例:{1,1,2,2,3,3,4,4,5,5}
//out:1,2,3,4,5
//头结点是肯定不会被删除的,删除的只有中间尾
//遍历链表,如果遇到重复值,则删除,并且指针p应紧接着后移继续判断,挂链删除即可
#include<stdio.h>
#include<stdlib.h>
#define N 10
typedef struct odd{
int data;
struct odd *next;
}ElemSN;
ElemSN *Createlink(int a[])
{
ElemSN *h,*tail;
h=tail=(ElemSN *)malloc(sizeof(ElemSN));
h->data=a[0];
h->next=NULL;
for(int i=1;i<N;i++){
tail=tail->next=(ElemSN *)malloc(sizeof(ElemSN));
tail->data=a[i];
tail->next=NULL;
}
return h;
}
void Delthesame(ElemSN *h)
{
ElemSN *p,*q;
q=h;
p=h->next;
while(p){
if(p->data!=q->data){//联动
q=p;
p=p->next;
}
else{//删
//删中间尾
q->next=p->next;
free(p);
p=q->next;
}
}
}
void Printlink(ElemSN *h)
{
ElemSN *p;
for(p=h;p;p=p->next){
printf("%6d",p->data);
}
}
int main()
{
int a[N],i,key;
ElemSN *head=NULL;
for(i=0;i<N;i++){
scanf("%d",&a[i]);
}
//正向建链
head=Createlink(a);
Delthesame(head);
Printlink(head);
return 0;
}
//设head指向一个非空单向链表,数据域值重复且无序,删除重复值结点
//头结点肯定是保留的,所以不用删除头结点
//遍历链表,用指针pkey指向逻辑新链表的尾结点,每遍历完链表,确定无重复pkey所指的data域的值时,pkey后移
//然后用指针p和指针q联动跑链表找与pkey所指的值相等的结点,挂链,删除(类似于数组的重复值删除,一层循环跑数组,一层循环查找剩余元素是否有与其值相同的单元,删除)
#include<stdio.h>
#include<stdlib.h>
#define N 10
typedef struct odd{
int data;
struct odd *next;
}ElemSN;
ElemSN *Createlink(int a[])
{
ElemSN *h,*tail;
h=tail=(ElemSN *)malloc(sizeof(ElemSN));
h->data=a[0];
h->next=NULL;
for(int i=1;i<N;i++){
tail=tail->next=(ElemSN *)malloc(sizeof(ElemSN));
tail->data=a[i];
tail->next=NULL;
}
return h;
}
void Delthesame(ElemSN *h)
{
ElemSN *p,*q,*pkey;
pkey=h;
while(pkey){
p=pkey->next;//每次要将p,q指针拉回
q=pkey;
while(p){//判断其余结点元素值
if(pkey->data!=p->data){//联动
q=p;
p=p->next;
}
else{//删
//删中间尾
q->next=p->next;
free(p);
p=q->next;
}
}
pkey=pkey->next;//移动逻辑尾结点
}
}
void Printlink(ElemSN *h)
{
ElemSN *p;
for(p=h;p;p=p->next){
printf("%6d",p->data);
}
}
int main()
{
int a[N],i,key;
ElemSN *head=NULL;
for(i=0;i<N;i++){
scanf("%d",&a[i]);
}
//正向建链
head=Createlink(a);
Delthesame(head);
Printlink(head);
return 0;
}