C语言-删除递增有序线性表中的重复元素

1.题目描述:

将一个递增有序的线性表中的重复元素删去。

2.基本思想:

1. 跳过重复元素: 利用*p指向最后一个不重复的指针,num记录最后一个不重复的data,当遇到重复元素时,L=L->next;当遇到不重复值时,p->next=L,num=L->data,p=L,L=L->next,更新相应信息。

2. 删除后继重复元素: 因为递增有序,重复元素逻辑上连在一起,因此每次遇到重复元素时,p->next=p->next->next,指向更后一位元素。

3.源代码

#include<stdio.h>
#include <stdlib.h>

typedef struct LNode{
	int data;
	struct LNode *next;
}LNode,*LinkList;

void NoDuplicate1(LinkList &L){
//	if(L->next==NULL) return;
//	LNode *p=L->next;//记录最后一个不重复元素 
//	LNode *s=L->next; 
//	int num=p->data;//记录最后一个不重复元素的值 
//	s=s->next;
//	while(s!=NULL){
//		if(s->data!=num){
//			p->next=s;
//			num=s->data;
//			p=s;
//			s=s->next;
//		}
//		else{
//			s=s->next;
//		}
//	}
	if(L->next==NULL) return;
	LNode *p=L->next;//记录最后一个不重复元素 
	LNode *s=L;  //如果要基于原链操作,保存L的原指针 
	int num=p->data;//记录最后一个不重复元素的值 
	L=L->next->next;
	while(L!=NULL){
		if(L->data!=num){
			p->next=L;
			num=L->data;
			p=L;
			L=L->next;
		}
		else{
			L=L->next;
		}
	}
	L=s; //还原原指针 
	
}

void NoDuplicate2(LinkList &L){
	if(L->next==NULL) return;
	LNode *p=L->next; 
	while(p!=NULL){
		if(p->next!=NULL&&p->data==p->next->data){//如果与后一个元素的值相等,则删去后一个元素,同时使指针指向更往后一位元素 
			p->next=p->next->next;
		}
		else p=p->next;
	}
}

int main(){
	LinkList L = (LinkList)malloc(sizeof(LNode));
	L->next = NULL;
	LNode *s = L;
	int x;
	scanf("%d",&x);
	while(x!=0){
		LNode *sdata=(LNode*)malloc(sizeof(LNode));
		sdata->data=x;;
		s->next = sdata;
		s=sdata;
		scanf("%d",&x);
	}
	s->next=NULL;
//	NoDuplicate1(L);
	NoDuplicate2(L);
	while(L->next!=NULL){
		L=L->next;
		printf("%d",L->data);
	}
	return 0;
}
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值