数据结构实验一——顺序表的实验和应用

数据结构实验一——顺序表的实验和应用

1.上机环境:
vs2010
2.上机要求:
⑴定义线性表的顺序存储表示;
⑵基于所设计的存储结构实现线性表的基本操作;
⑶编写一个主程序对所实现的线性表进行测试;
⑷线性表的应用:①设线性表L1和L2分别代表集合A和B,试设计算法求A和B的并集C,并用线性表L3代表集合C;②(选做)设线性表L1和L2中的数据元素为整数,且均已按值非递减有序排列,试设计算法对L1和L2进行合并,用线性表L3保存合并结果,要求L3中的数据元素也按值非递减有序排列。
3.代码

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
#define INCREAMENT 10
typedef struct{
	int *elem;
	int length,listsize;
}SqList;
void Initlist(SqList &L)
{
	L.elem=(int *)malloc(MAXSIZE*sizeof(int));
	if(!L.elem) exit(1);
	L.length=0;
	L.listsize=MAXSIZE;
}
int Get(SqList &L,int i);
void Insert(SqList &L);
int Delete(SqList &L,int i);
void Union(SqList &L1,SqList &L2,SqList &L3);//修改函数的参数

int main()
{
	int choose,e,i;
	int *q,*p;
	SqList L1;
	Initlist(L1);
	printf("请输入集合A的长度和值:");
	scanf("%d",&L1.length);
	q=&(L1.elem[L1.length-1]);
	for(p=&(L1.elem[0]);p<=q;p++)
		scanf("%d",p);
	do
	{
		printf("\n请选择您要进行的操作:\n[0]退出\n[1]取值\n[2]插入\n[3]删除\n[4]合并\n");
		scanf("%d",&choose);
	    switch(choose)
		{
		case 0:break;
		case 1:printf("请输入您要取值的位数:");scanf("%d",&i);
			if(i<0||i>L1.length) 
				printf("\n取值位置非法!\n");
			e=Get(L1,i);
			printf("第%d位的值为%d\n",i,e);
			break;
	    case 2:Insert(L1);break;
	    case 3:
			printf("请输入你要删除元素的位置:");
			scanf("%d",&i);
			e=Delete(L1,i);
			printf("删除的元素是%d",e);
			break;
	    case 4:
			SqList L2;
			Initlist(L2);
			printf("请输入集合B的长度和值:");
			scanf("%d",&L2.length);
			q=&(L2.elem[L2.length-1]);
			for(p=&(L2.elem[0]);p<=q;p++)
				scanf("%d",p);//输入L2,集合B的值和长度
			SqList L3;
			Initlist(L3);
			Union(L1,L2,L3);
			printf("并集C:");
			for(p=&(L3.elem[0]);p<=&(L3.elem[L3.length-1]);p++)
				printf("%d ",*p);
			printf("\n");break;
	    default:printf("输入错误!\n");
	    }
	}while(choose!=0);
	system ("pause");
	return 0;
}

int Get(SqList &L,int i)
{
	int e;
	e=L.elem[i-1];
	return e;
}

void Insert(SqList &L)
{
	int i,e;
	int *q,*p;
	int *newbase;
	printf("请输入您要插入的值及其位数:");
	scanf("%d%d",&e,&i);
	if(i<1||i>L.length+1)
	printf("插入值的位数非法!\n");
	if(L.length>=L.listsize)
	{
		newbase=(int *)realloc(L.elem,(L.listsize+INCREAMENT) * sizeof(int));
		if(!newbase) printf("存储分配失败!\n");
		L.elem=newbase;
		L.listsize+=INCREAMENT;
	}
	q=&(L.elem[i-1]);
	for(p=&(L.elem[L.length-1]);p>=q;p--)
		*(p+1)=*p;
	*q=e;
	++L.length;
	for(p=&(L.elem[0]);p<&(L.elem[L.length]);p++)
		printf("%d ",*p);
	printf("\n");
}

int Delete(SqList &L,int i)
{
	int e,*p,*q;
	
	if(i<0||i>L.length)
		printf("删除位置非法!\n");
	e=L.elem[i-1];
	q=&(L.elem[L.length-1]);
	for(p=&(L.elem[i-1]);p<q;p++)
		*p=*(p+1);
	--L.length;
	for(p=&(L.elem[0]);p<&(L.elem[L.length]);p++)
		printf("%d ",*p);
	printf("\n");
	return e;
}

void Union(SqList &L1,SqList &L2,SqList &L3)
{
	int *p,*q,*t;
	int flag;
	L3.length=L1.length;
	q=&(L3.elem[0]);//L3
	for(p=&(L1.elem[0]);p<=&(L1.elem[L1.length-1]);p++,q++)//L1赋值给L3
		*q=*p;
	for(p=&(L2.elem[0]);p<=&(L2.elem[L2.length-1]);p++)//L2赋值给L3
	{
		flag=0;
		for(t=&(L1.elem[0]);t<=&(L1.elem[L1.length-1]);t++)
			if((*t)==(*p)) flag=1;
		if(flag) continue;
		*q=*p;
		q++;
		L3.length++;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值