C数据结构-顺序表

顺序表

顺序表利用 一块连续的内存单元 依次存储数据元素

顺序表的定义:
#define MAXLEN 10   //开辟的总的存储空间
typedef int DataType;  //DataType相当于int的别名
typedef struct {
 DataType data[MAXLEN];  //存放顺序表的数据,表示最多可以存储10个元素
 int length;  //表示顺序表已使用的长度
}SeqList; 
创建一个空的顺序表:
//初始化顺序表
void InitList(SeqList *L){
  L->length=0;  //已使用的长度为0,表示顺序表为空
}

在这里插入图片描述

建立一个顺序表:
//创建线性表
void CreateList(SeqList *L,int n){
   int i;
   printf("请输入%d个整数\n",n);
   for(i=0;i<n;i++){
    scanf("%d", &L->data[i]);
	L->length++;
   }
}

例如先在顺序表中添加9个整数7、8、9、10、11、12、13、14、15

此时顺序表的长度应为3

在这里插入图片描述

判断顺序表是否为满/是否为空:
void Full(SeqList *L){
    if(L->length>=MAXLEN){
        printf("顺序表已满");
        return -1; 
    } 
}
void empty(SeqList *L){
    if(L->length==0){
		printf("顺序表为空");
		return 0; 
	}
}

顺序表为满时的状态:

在这里插入图片描述

向顺序表中插入数据:

向顺序表中插入数据的前提是: 顺序表不为满

//插入操作 
int InsElem(SeqList *L,int i,DataType x) 
{
	if(i<1 || i>L->length){
		printf("插入的位置出错");
		return 0;	
	}
    //代表插入位置为表尾
	if(i == L->length+1){
		L->data[i-1] = x;
		L->length++;
		return 1;
	}
    //在指定位置插入数据
	for(j=L->length-1;j>=i-1;j--){
		L->data[j+1]=L->data[j];
	}
	L->data[i-1] = x;
	L->length++;
	return 1;
}
顺序表尾部插入数据:

在这里插入图片描述

在指定位置插入数据:

在这里插入图片描述

删除指定位置元素
//删除操作
int DelElem(SeqList *L,int i,DataType *x){
	int j;
	*x = L->data[i-1];
	for(j=i;j<L->length;j++){
		L->data[j-1] = L->data[j];
	}
	L->length--;
	return 1;
}

在这里插入图片描述

全部代码:

#include<stdio.h>
#define MAXLEN 100   //开辟的总的存储空间
typedef int DataType;  //DataType相当于int的别名,作用范围为本程序

//定义一个结构体
typedef struct {
 DataType data[MAXLEN];  //存放顺序表的数据
 int length;  //顺序表的长度
}SeqList;   //结构体的名称

//初始化顺序表
void InitList(SeqList *L){
  L->length=0;  //顺序表为空
}

//创建线性表
void CreateList(SeqList *L,int n){
   int i;
   printf("请输入%d个整数\n",n);
   for(i=0;i<n;i++){
    scanf("%d", &L->data[i]);
	L->length++;
   }
}

int GetElem(SeqList *L,int i,DataType *x){
   if(i<1||i>L->length)
	   return 0;
   else{
	   *x=L->data[i-1];
	   return 1;
   }
}

//按值查找
int Locate(SeqList *L,DataType x){
	int i=0;
	while(i<L->length&&L->data[i]!=x)
		i++;
	if(i>=L->length)
		return 0;
	else
		return i+1;

}
//插入操作 
int InsElem(SeqList *L,int i,DataType x) 
{
	/*在顺序表L中在第i位插入新元素x函数*/
	int j;
	if(L->length>=MAXLEN){
		printf("顺序表已满");
		return -1; 
	} 
	if(i<1 || i>L->length){
		printf("插入的位置出错");
		return 0;	
	}
	if(i == L->length){
		L->data[i-1] = x;
		L->length++;
		return 1;
	}
	for(j=L->length-1;j>=i-1;j--){
		L->data[j+1]=L->data[j];
	}
	L->data[i-1] = x;
	L->length++;
	return 1;
}

//删除操作
int DelElem(SeqList *L,int i,DataType *x){
	int j;
	if(L->length==0){
		printf("顺序表为空");
		return 0; 
	}
	if(i<1 || i>L->length){
		printf("不存在第i个元素");
		return 0; 
	}
	*x = L->data[i-1];
	for(j=i;j<L->length;j++){
		L->data[j-1] = L->data[j];
	}
	L->length--;
	return 1;
} 

//输出表中的元素操作

void DispList(SeqList *L){
	int i;
	for(i=0;i<L->length;i++){
		printf("%5d",L->data[i]);
	}
} 

//显示菜单函数
void Menu(){
	printf("\n		顺序表的各种操作");
	printf("\n===================================");
	printf("\n	1.建立顺序表			"); 
	printf("\n	2.插入元素				"); 
	printf("\n	3.删除元素				"); 
	printf("\n	4.按位置查找元素		");
	printf("\n	5.按元素值查找其在表中位置			");  
	printf("\n	6.求顺序表的长度					"); 
	printf("\n	7.返回					");
	printf("\n===================================");
	printf("\n请输入菜单号(0-6):"); 
} 
 
void  main(){
	SeqList L;  //顺序表的名称
	DataType x;
	int n,i,loc;
	char ch1,ch2,a;
	ch1 = 'y';
	while(ch1=='y'||ch1=='Y'){
		Menu();
		scanf("%c",&ch2);
		getchar();
		switch(ch2){
			case '1':
				InitList(&L);
				printf("请输入建立线性表的个数:"); 
				scanf("%d",&n);
				CreateList(&L,n);
				printf("建立的线性表为:");
				DispList(&L);
				break; 
			case '2':
				printf("请输入要插入的位置:");
				scanf("%d",&i); 
				printf("请输入要插入的元素值:");
				scanf("%d",&x);
				if(InsElem(&L,i,x)){
					printf("已成功在%d的位置上插入%d,插入后的线性表为:\n",i,x);
					DispList(&L);
				} else{
					printf("输入插入的参数错误");
				}
				break;
			case '3':
				printf("请输入要删除的元素的位置:");
				scanf("%d",&i); 
				if(DelElem(&L,i,&x)){
					printf("已成功在第%d位置上删除%d,删除后的线性表为:\n",i,x);
					DispList(&L);
				}else{
					printf("\n输入删除的参数错误"); 
				}
				break;
			case '4':
				printf("请输入要删查看表中元素的位置(从1开始):");
				scanf("%d",&i); 
				if(GetElem(&L,i,&x)){
					printf("已在当前线性表中的%d的元素的值为:%d\n",i,x);
				}else{
					printf("\n输入删除的位置错误"); 
				}
				break;
			case '5':
				printf("请输入要查找的元素为:");
				scanf("%d",&x);
				loc=Locate(&L,x);
				if(loc){
					printf("查找元素值%d的位置为:%d",x,loc);
				}else{
					printf("该表中无此元素!");
				}
				break;
			case '6':
				printf("当前线性表的长度为:%d",L.length);
				break;
			case '0':
				ch1='n';
				break;
			default:
				printf("输入有误,请输入0~6进行选择");
		}
		if(ch2!='0'){
			printf("\n按回车健继续,按任意键返回主菜单\n");
			a=getchar();
			if(a!='\xA'){
				getchar();
				ch1='n';
			} 
		}
	}
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值