实验题一(实现顺序表各种基本运算的算法)

目的:领会顺序表存储结构和掌握顺序表中各种基本运算算法设计。
内容:编写一个.cpp的程序,实现顺序表的各种基本运算和整体建表算法(假设顺序表的元素类型为 Elemtype char),并在此基础上设计一个主程序,完成如下功能:
(1)初始化顺序表L。
(2)依次插入a,b,c,d,e元素。
(3)输出顺序表L。
(4)输出顺序表L的长度。
(5)判断顺序表L是否为空。
(6)输出顺序表L的第3个元素。
(7)输出元素a的位置。
(8)在第4个元素位置上插入f元素。
(9)输出顺序表L。
(10)删除顺序表L的第3个元素。
(11)输出顺序表L。
(12)释放顺序表L。

code:

#include<cstdio>
#include<cstdlib>
#include<malloc.h>
#define Maxsize 100
typedef char Elemtype;
typedef struct{
	Elemtype data[Maxsize];//存放顺序表元素 
	int length;//存放顺序表的长度 
}Sqlist;//声明顺序表的类型 
//整体建立顺序表
void CreatSqlist(Sqlist* &L,Elemtype a[],int n){
	int i;
	L=(Sqlist *)malloc(sizeof(Sqlist));
	for(i=0;i<n;i++)
		L->data[i]=a[i];
		L->length=n;
} 
//初始化线性表
void InitSqlist(Sqlist* &L){
	L=(Sqlist *)malloc(sizeof(Sqlist));//分配存放线性表的空间 
	L->length=0; 
} 
//销毁线性表
void DestroySqlist(Sqlist* &L){
	free(L);
} 
//判断顺序表是否为空表
bool SqlistEmpty(Sqlist*L){
	return (L->length==0);
} 
/* TODO (#1#): SqSqlist */
//求线性表的长度
int Sqlistlength(Sqlist*L){
	return(L->length);
} 
//输出线性表
void  DispSqlist(Sqlist*L){
	int i;
	for(i=0;i<L->length;i++)
		printf("%c",L->data[i]);
		printf("\n");
}
//求线性表中第i个元素值
bool GetElem(Sqlist*L,int i,Elemtype &e){
	if(i<1||i>L->length)
		return false;
		e=L->data[i-1];
		return true;
} 
//查找第一个值域为e的元素序号
int Locate(Sqlist*L,Elemtype e){
	int i=0;
	while(i<L->length&&L->data[i]!=e)
	i++;
	if(i>=L->length)
	return 0;
	else
	return i+1;
} 
//插入第i个元素
bool SqlistInsert(Sqlist*&L,int i,Elemtype e){
	int j;
	if(i<1||i>L->length-1)
	return false;
	i--;		//将顺序表位序转换为data[]下标 
	for(j=L->length;j>i;j--){//将data[i]及后面元素后移一个位置 
		L->data[j]=L->data[j-1];
		L->data[i]=e;
		L->length++;//顺序表长度增1
		return true; 
	}
}
	//删除第i个元素
	bool SqlistDelete(Sqlist*&L,int i,Elemtype &e){
		int j;
		if(i<1||i>L->length){
			return false;
		}
	i--;		//将顺序表位序转换为data[]下标 
	e=L->data[i];
	for(j=i;j<L->length-1;j++){
		L->data[j]=L->data[j+1];
		L->length--;
	}
	return true;	 
} 

int main(){
	Sqlist *L;
	char a[5]={0};
	Elemtype e;

	printf("顺序表的基本运算如下:\n");
	printf("(1)初始化顺序表L\n");
	InitSqlist(L);
	CreatSqlist(L,a,5);
	printf("(2)依次插入a,b,c,d,e元素\n"); 
	SqlistInsert(L,1,'a');
	SqlistInsert(L,2,'b');
	SqlistInsert(L,3,'c');
	SqlistInsert(L,4,'d');
	SqlistInsert(L,5,'e');
	printf("(3)输出顺序表L:"); DispSqlist(L);
	printf("(4)输出顺序表L的长度%d\n",Sqlistlength(L)); 	
	printf("(5)判断顺序表L为%s\n",SqlistEmpty(L)?"空":"非空"); 
	GetElem(L,3,e); 
	printf("(6)输出顺序表L的第3个元素%c\n",e);
	printf("(7)输出元素a的位置为%d\n",Locate(L,'a')); 
	printf("(8)在第4个元素位置上插入f元素\n"); 
	SqlistInsert(L,4,'f');
		printf("(9)输出顺序表L:"); DispSqlist(L);
	printf("(10)删除顺序表L的第3个元素\n"); 
	SqlistDelete(L,3,e);
		printf("(11)输出顺序表L:"); DispSqlist(L);
	printf("(12)释放顺序表L\n"); 
	DestroySqlist(L); 
	return 0;
} 

附加code:

#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define TRUE 1

#define MAXSIZE 30     /*初始分配的顺序表长度*/
typedef  int ElemType;  /*定义表元素的类型*/
typedef struct {
	ElemType elem[MAXSIZE];      /*存储空间的基地址*/
	int length;           /*顺序表的当前长度*/
}SeqList;

int Init_SeqList(SeqList *L); /*初始化顺序表*/
int Create_SeqList(SeqList *L,int n); /*创建顺序表*/
int Insert_SeqList(SeqList *L,int i,ElemType x);/*顺序表的插入操作*/
int Traverse_SeqList(SeqList *L);  /*顺序表的遍历*/
int Delete_SeqList(SeqList *L,int i); /*顺序表的删除操作*/
int Locate_SeqList(SeqList *L,ElemType e); /*查找值为e的元素*/

int Init_SeqList(SeqList *L){
	L=(SeqList *)malloc(sizeof(SeqList));
    L->length=0; 		/*空表长度为0 *///填空
}/*InitList*/

int Create_SeqList(SeqList *L,int n){
    ElemType x;
	ElemType elem[MAXSIZE];  
    
    int i;
    for(i=1; i<=n;i++){
        printf("Please Input data %d: ",i);
        scanf("%d",&x);
        elem[i]=x;
        if(!Insert_SeqList( L,i,x))
            return ERROR;
    }
    return TRUE;
}/*CreateList*/

/*输出顺序表中的元素*/
int Traverse_SeqList(SeqList *L){//遍历
    int i;
    for(i=0;i<L->length;i++)
        printf("%-7d",L->elem[i]);//填空
	printf("\n");
}/*TraverseList*/

int Insert_SeqList(SeqList *L,ElemType x,int i){
    int j;
if(i<1||i>L->length+1) //填空
return ERROR;   
i--; 
for(j=L->length;j>i;j--)
{  
   L->elem[j]= L->elem[j-1];
 }
    L->elem[i]=x;                     
    L->length++;                         
    return TRUE;
}/*ListInsert*/

/*在顺序表中删除第i个元素*/
int Delete_SeqList(SeqList *L,int i,ElemType e){
int j;
if(i<1||i>L->length) 
return ERROR;   
i--;
e=L->elem[i];
for(j=i+1;j<=L->length;j++)
 L->elem[j-1]=L->elem[j];
 L->length--;                      
    return TRUE;
}
/*在顺序表中查找指定值元素,返回其序号*/
int Locate_SeqList(SeqList *L,ElemType e){    
int i=1;
while (i<=L->length && L->elem[i]!=e)//填空
i++;
if (i==L->length+1) return ERROR;//填空
else return i;//填空
}

int main(){
SeqList *sl;
int n,m,k,o;
int x;
printf("**************************************************\n"); 
printf("               顺 序 表 常 用 算 法\n"); 
printf("**************************************************\n\n"); 
sl=(SeqList *)malloc(sizeof(SeqList));	

printf("1、初始化线性表:设置表长为0\n"); 
Init_SeqList(sl);
 printf("顺序表初始化成功……\n\n");

printf("2、创建顺序表:\n");  
do{
printf("请输入顺序表长度(n>=0):");
scanf("%d",&n);   /*输入顺序表的元素个数*/
}while (n<0);
Create_SeqList(sl,n);
 printf("顺序表创建成功……\n\n"); ;
        
printf("3、遍历顺序表:\n");  /*依次访问顺序表中所有元素*/
Traverse_SeqList(sl);

printf("4、顺序表的插入操作:\n");  
printf("请输入待插入的数据及其位序(location,data):");
scanf("%d%d",&m,&k);
Insert_SeqList(sl,m,k);
 printf("插入操作执行成功……\n操作结果:");
Traverse_SeqList(sl);

printf("5、顺序表的删除操作:\n");
printf("请输入待删除的数据(location,data):");
scanf("%d%d",&o,&x);
Delete_SeqList(sl,o,x); 
printf("删除操作执行成功......\n操作结果:");
Traverse_SeqList(sl);
return 0;
}

发布了178 篇原创文章 · 获赞 64 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42403069/article/details/102906309