链表结点删除-----删除重复值结点

//设数据域的值重复且升序有序,删除链表中的重复值结点
//例:{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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值