数据结构----顺序表的实现和应用

  1. 运行样例程序,理解静态分配顺序存储结构的线性表的下列基本操作。

(1)初始化顺序表 (2)创建顺序表 (3)判断空表 (4)求顺序表长度 (5)输出顺序表 (6)取顺序表位置 i 的元素值 (7)在顺序表中查找值为 e 的元素位置 (8)向顺序表中插入一个元素 (9)从顺序表中删除一个元素

#include<stdio.h>
#define MaxSize 50
typedef int ElemType;
typedef struct
{
	ElemType data[MaxSize];
	int length;
}SqList;//结构体变量
void InitList(SqList &L)//引用类型
{
	L.length=0;
}
void CreateList(SqList &L,int n)
{
	int i;
	printf("输入%d个元素:\n",n);
	for(i=0;i<n;i++)
	scanf("%d",&L.data[i]);
	printf("\n");
	L.length=n;
}
int ListEmpty(SqList L)
{
	return(L.length==0);
}
int ListLength(SqList L)
{
	return(L.length);
}
void DispList(SqList L)
{
	int i;
	if(L.length==0)return;
	for(i=0;i<L.length;i++)
	printf("%d",L.data[i]);
	printf("\n");
}
int GetElem(SqList L,int i,ElemType &e)
{
	if(i<1||i>L.length)return 0;
	e=L.data[i-1];
	return 1;
}
int LocateElem(SqList L,ElemType e)
{
	int i=1;
	while(i<=L.length&&L.data[i-1]!=e)i++;
	if(i<=L.length)
	return i;
	else return 0;
}
int ListInsert(SqList &L,int i,ElemType e)
{
	int j;
	if(i<1||i>L.length+1)return 0;
	for(j=L.length-1;j>=i-1;j--)
	L.data[j+1]=L.data[j];
	L.data[i-1]=e;
	++L.length;
	return 1;
}
int ListDelete(SqList &L,int i,ElemType &e)
{
	int j;
	if(i<1||i>L.length)return 0;
	e=L.data[i-1];
	for(j=i-1;j<L.length-1;j++)
	L.data[i]=L.data[j+1];
	-L.length;
	return 1;
}
int main()
{
	ElemType dd,a,b;
	SqList L;
	InitList(L);
	if(ListEmpty(L))
	printf("顺序表为空!\n");
	printf("创建顺序表!");
	CreateList(L,5);
	printf("输出顺序表所有元素!\n");
	DispList(L);
	printf("输出顺序表长度!\n");
	printf("ListLength(L)=%d\n",ListLength(L));
	printf("判断顺序表是否为空!\n");
	printf("ListEmpty(L)=%d\n",ListEmpty(L));
	printf("输出顺序表第三个位置元素到dd!\n");
	GetElem(L,3,dd);
	printf("dd=%d\n",dd);
	printf("查找元素a:");
	scanf("%d",&a);
	printf("元素%d在顺序表的位置为:%d\n",a,LocateElem(L,a));
	printf("插入元素b:");
	scanf("%d",&b);
	printf("在顺序表第四个位置插入%d!\n",b);
	ListInsert(L,4,b);
	printf("输出插入操作后顺序表所有元素!\n");
	DispList(L);
	printf("删除顺序表第三个位置的元素!\n");
	ListDelete(L,3,dd);
	printf("输出删除操作后顺序表所有元素!\n");
	DispList(L);
}

2、采用书上第 22 页定义的线性表动态分配顺序存储结构,编程实现书中算法 2.3、算法 2.4 和算法 2.5。 提示:要实现算法 2.4 和 2.5,必须先创建 n 个数据元素的顺序表,另外输出顺序表的操作也是必要的。

#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<time.h>
#include<math.h>//overflow头文件
#include<stdlib.h>
#define LISTSIZE 100
#define ADD 10
#define ERROR	0
typedef int ElemType;
typedef struct{
	ElemType *elem;
	int length;//当前长度
	int listsize;//当前分配的存储容量
}SqList;
int InitList(SqList &L)//初始化数据
{
	L.elem=(ElemType *)malloc(LISTSIZE *sizeof(ElemType));
	if(!L.elem)exit(OVERFLOW);
	L.length=0;
	L.listsize=LISTSIZE;
	return 0;
}
int ListLength(SqList L)
{
	return(L.length);
}
void CreateList(SqList &L)//初始化线性表
{
	int i=0;
	srand((unsigned)time(NULL));
	for(i=0; i < LISTSIZE; i++) {
		L.elem[i] = rand()%100;
		L.length++;
	}
}
void ListDelete(SqList &L,int i,ElemType &e)
{
	if(i>L.length||i<1)exit(OVERFLOW);
	ElemType* p;
	ElemType*q;
	p=L.elem+i-1;
	e=*p;
	q=L.elem+L.length-1;
	for(;p<q;p++)
	*p=*(p+1);
	L.length--;
}
void Select()
{
	printf("**********************************************\n");
	printf("初始化线性表完成\n");
	printf("可进行操作如下\n1.插入元素\t2.删除某个元素\t3.寻找某个元素\t0.退出");
}
int ListInsert(SqList &L,int i,ElemType e)
{
	ElemType* newbase;
	if(i<1||i>L.length+1)return ERROR;
	if(L.length>=L.listsize){
		newbase=(ElemType*)realloc(L.elem,(L.listsize+ADD)*sizeof(ElemType));
		if(!newbase)exit(OVERFLOW);
		L.elem=newbase;
		L.listsize+=ADD;
	}
	ElemType * p;
	ElemType * q;
	p=L.elem+i-1;
	for(q=L.elem+L.length-1;q>=p;q--)*(q+1)=*q;
	*p=e;
	L.length+=1;
	return 0;
}
int LocateElem(SqList L,ElemType e)//查找表中元素
{
	int i=1;
	ElemType *p=L.elem;
	while(i<=L.length&&*p++!=e)++i;
	if(i<=L.length)return i;
	else return 0;
}
int main()
{
	int i;
	SqList L;
	InitList(L);
	CreateList(L);
	Select();
	printf("\n现在的线性表为:\n");
	for(i=0;i<L.length;i++)
	{printf("%d\t",L.elem[i]);
	if((i+1)%10==0)printf("\n");}
	int select=1;
	ElemType e;
	while(select!=0)
	{
		printf("\n请选择操作\n");
		scanf("%d",&select);
		if(select!=0&&select!=1&&select!=2&&select!=3)return ERROR;
		switch(select){
			case 1:printf("请输入插入的元素和插入的位置\n");
			scanf("%d %d",&e,&i);
			ListInsert(L,i,e);
			printf("插入后的线性表为:\n");
			for(i=0;i<L.length;i++)
			{printf("%d\t",L.elem[i]);
			if((i+1)%10==0)printf("\n");}break;
	        case 2:printf("请输入删除的位置\n");
			scanf("%d",&i);
			ListDelete(L,i,e);
			printf("删除后的线性表为:\n");
			for(i=0;i<L.length;i++)
			{printf("%d\t",L.elem[i]);
			if((i+1)%10==0)printf("\n");}
	        break;
	        case 3:printf("请输入要查找的元素:\n");
	        scanf("%d",&e);
			i=LocateElem(L,e);
			if(i==0)printf("未查找到该元素\n");
			else printf("该元素位序是%d\n",i);
			break;
			case 0:break;}
	}
	return 0;
}

3、采用线性表动态分配顺序存储结构,实现顺序表的合并操作:①设有线性表 La 和 Lb,试设计算法将 La 和 Lb 归并为新的线性表 Lc;②设线性表 La 和 Lb 中的数据元素为整数,且均已按值非递减有序排列, 要求 Lc 中的数据元素也按值非递减有序排列

#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<time.h>
#include<math.h>//overflow头文件
#include<stdlib.h>
#define LISTSIZE 100
#define ADD 10
#define ERROR	0
typedef int ElemType;
typedef struct{
	ElemType *elem;
	int length;//当前长度
	int listsize;//当前分配的存储容量
}SqList;
void MergeList(SqList La,SqList Lb,SqList &Lc)
{
	ElemType *pa=La.elem;
	ElemType *pb=Lb.elem;
	Lc.length=La.length+Lb.length;
	ElemType * pc=Lc.elem;
	Lc.elem=(ElemType *)malloc(Lc.length *sizeof(ElemType));
	if(!Lc.elem)exit(OVERFLOW);
	int i=0,j=0,k=0;
	for(;i<La.length&&j<Lb.length;){
		if(La.elem[i]<=Lb.elem[j]){
			Lc.elem[k]=La.elem[i];
			i++;k++;
		}
		else{Lc.elem[k]=Lb.elem[j];
			j++;k++;
		}
	}
	while(i<La.length)	
	{Lc.elem[k]=La.elem[i];
	i++;k++;}
	while(j<Lb.length)	
	{Lc.elem[k]=Lb.elem[j];
	j++;k++;}
	Lc.length=k;
}
void CreateList(SqList &L,int m)//初始化线性表
{
	int i=0;
	srand((unsigned)time(NULL));
	for(i=0; i <L.length; i++) {
		L.elem[i] = m*rand()%100;
	}
}
int InitList(SqList &L)//初始化数据
{
	L.elem=(ElemType *)malloc(L.length*sizeof(ElemType));
	if(!L.elem)exit(OVERFLOW);
	return 0;
}
void output(SqList L)
{
	for(int i=0;i<L.length;i++)
			{printf("%d\t",L.elem[i]);
			if((i+1)%10==0)printf("\n");}
}
void pailie(SqList & L)
{
	int i=0;ElemType t;
	for(;i<L.length-1;i++)
	{
		for(int j=i+1;j<L.length;j++)
		if(L.elem[j]<L.elem[i]){
			t=L.elem[j];
			L.elem[j]=L.elem[i];
			L.elem[i]=t;
		}
	}
}
int main()
{
	SqList La,Lb,Lc;
	printf("请输入La,Lb预计的元素个数:\n");
	scanf("%d %d",&La.length,&Lb.length);
	InitList(La);
	InitList(Lb);
	CreateList(La,1);
	CreateList(Lb,2);
	printf("目前线性表La元素是:\n");
	pailie(La);
	output(La);
	printf("\n目前线性表Lb元素是:\n");
	pailie(La);
	output(Lb);
	MergeList(La,Lb,Lc);
	printf("\n合并后Lc中元素是:\n");
	output(Lc);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lililiQAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值