数据结构上机第一次_3删除重复元素(顺序表/单链表)

数据结构上机第一次_3删除重复元素(顺序表/单链表)

题目

3.设线性表L,元素值为整型的且存在相同值,分别采用顺序结构和链式结构存储,编写函数,利用原空间,删除重复的元素值。

代码

(1)顺序结构

//设线性表L,元素值为整型的且存在相同值,分别采用顺序结构和链式结构存储,编写函数,利用原空间,删除重复的元素值。
#include<iostream>
#include<stdlib.h>
#include<malloc.h>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define PARA_ERROR 0
#define OVERFLOW -2 
#define LISTINITSIZE 256    //初次分配空间大小
#define LISTINCREMENT 128    //空间分配增量大小

typedef int ElemType;
typedef int Status;
typedef struct Seqlist
{
	ElemType *pdata;    //动态存储空间的基地址
	int length;    //存储数据元素的个数
	int size;    //当前已分配的存储空间大小	 
}Seqlist;

Status InitList(Seqlist &L)
{
	//初始化顺序表 
    L.pdata=(ElemType*) malloc (LISTINITSIZE*sizeof(ElemType));
    if(L.pdata==NULL)
    	exit (OVERFLOW);
	L.size=LISTINITSIZE;
	L.length=0;
	return OK; 
} 

Status CreateList(Seqlist &L)
{
	//创建顺序表
	cout<<"请输入顺序表长度:";
	cin>>L.length;
	cout<<"请输入顺序表元素:";
	for(int i=0;i<L.length;i++)
	{
		cin>>L.pdata[i];
	}
	cout<<"顺序表建立成功!"<<endl;
	return OK;	 
}

Status ListTraverse(Seqlist L)
{
	//遍历顺序表并依次输出其数据元素
	for(int i=0; i<L.length; i++)
	{
		cout<<L.pdata[i]<<" ";
	}
	cout<<endl;
	return 0;
} 

Status DeleteRepeatList(Seqlist &L)
{
	//删除重复元素
	for(int i=0;i<L.length;i++)
	{
		for(int j=i+1;j<L.length;j++)
		{
			if(L.pdata[j]==L.pdata[i])
			{
				for(int k=j;k<L.length-1;k++)
				{
					L.pdata[k]=L.pdata[k+1];
				}
				L.length-=1;
				j-=1;    //删除后j也要减一 
			}
		}
	} 
}

int main()
{
	Seqlist L;
	InitList(L);
	CreateList(L);
	cout<<"顺序表元素为:"<<endl;
	ListTraverse(L);
	DeleteRepeatList(L);
    cout<<"删除后的顺序表元素为:"<<endl;
	ListTraverse(L);
}
 

(2)链式结构

//设线性表L,元素值为整型的且存在相同值,分别采用顺序结构和链式结构存储,编写函数,利用原空间,删除重复的元素值。 
//单链表 
#include <iostream>
#include <stdlib.h>
#include <malloc.h>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define PARA_ERROR 0
#define OVERFLOW -2
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
	ElemType data;    //数据域 
	struct LNode *next;    //指针域
}LNode, *LinkList;

Status InitList(LinkList &L)
{
	//初始化单链表 
	L=(LNode*) malloc (sizeof(LNode));
	if(L==NULL) exit(OVERFLOW);
	L->next=NULL;
	return OK; 
}

Status ListLength(LinkList L)
{
	//单链表长度
	int n=0;
	LNode *p;
	p=L->next;
	while (p)
	{
		n++;
		p=p->next;
	}
	return(n);
}

Status InsertElem(LinkList &L, int i, ElemType e)
{
	//在第i个位置插入e
	LNode *s=(LNode*)malloc(sizeof(LNode));    //申请新的节点s
	if(s==NULL) exit(OVERFLOW);    //申请节点失败 
	s->data=e;
	LNode *p;
	p=L->next;
	if(i==1)
	{
		s->next=p;
		L->next=s;
	}
	else if(i>1&&i<=ListLength(L))
	{
		for(int j=0;j<i-2;j++)
		{
			p=p->next;
		}
		s->next=p->next;
		p->next=s;
	}
	else if(i==ListLength(L)+1)
	{
		for(int j=0;j<i-2;j++)
		{
			p=p->next;
		}
		p->next=s;
		s->next=NULL;
	}
	else
	{
		cout<<"表中没有该位置!"<<endl;
	}
	return OK;
}

Status CreateList(LinkList &L)
{
	//建立单链表
	int i,len=0;
	ElemType e;
	cout<<"请输入单链表长度:";
	cin>>len;
	cout<<"请输入单链表元素数据:";
	for(i=1;i<len+1;i++)
	{
		cin>>e;
		InsertElem(L,i,e);
	}
	return OK;
}

Status ListTraverse(LinkList L)
{
	//遍历单链表
	LNode *p;
	p=L->next;
	while(p)
	{
		cout<<p->data<<" ";
		p=p->next;
	}
	cout<<endl;
	return OK;
}

Status DeleteRepeatList(LinkList &L)
{
	//删除重复元素
	LNode *p,*s;
	p=L->next;
	while(p)
	{
		LNode *q;
		q=p;
		while(q->next)
		{
			if(q->next->data==p->data)    //q->next是重复元素!!这样不需要用到前驱元素 
			{
				s=q->next;
				q->next=s->next;
				free(s);
			}
			else q=q->next;
		}
		p=p->next;
	} 
}

int main()
{
	LinkList L;
	InitList(L);
	CreateList(L);
	cout<<"单链表元素为:"<<endl;
	ListTraverse(L);
	DeleteRepeatList(L);
	cout<<"删除后单链表元素为:"<<endl;
	ListTraverse(L);
 } 

思想

顺序表:依次往前覆盖
单链表:把p->next设为重复元素比较方便

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值