线性表的顺序存储

线性表的顺序存储

你好! 这是我第一次使用博客记录我学习的生活,闲话不多说,在你基本了解C语言后或者对数组,指针,结构体有比较好的一个掌握的话,那么你学习第一章后,理解一下顺序表概念,就从阿牛理解的角度阐述和操作这个顺序表(静态)记录一下我的操作。
下面展示我的 相关代码片

1、顺序表类型的定义

#include <stdio.h>
#include <stdlib.h>
#define SIZE 100
void IntList(SeqList *L){		//初始化顺序表 
	L->length = 0;
}
  1. 顺序表SeqList是一个结构体
  2. 包括两个成员data数组和顺序表的实时长度length
    首先你要想到,如果要想通过一个函数完成外部参数,就要给函数传参时进行地址传递,而且了解这一个结构体变量就是一个顺序表,操作的是针对data数组;

2、顺序表的初始化

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

3、顺序表的建立

/*插入顺序表元素 */
void CreatList(SeqList *L,int n){
	int i;
	printf("请输入%d个整数:",n);
	for(i=0;i<n;i++){
		scanf("%d",&L->data[i]);
	}
	L->length = i;
}

此处无非就是对这个结构体元素的**data[SIZE]**针对操作,进行一个复制操作,而传入的参数是指针 *SeqList L,所以对结构体指针指向的语法就是 L->data[i];

4、 查找操作

1、按序号查找

/*按序号查找*/
int GetElem(SeqList *L,int n,DataType *number){ //获取顺序表中第i位元素函数 
	if(n<0||n>L->length+1){
		printf("查找超出边范围!!!!\n");
		return 0; 
	}
	*number = L->data[n-1];
	return 1;
}

DataType *number参数的存在就是Wie了将查找到的数据元素返回到外部变量当中;
2、按值查找

int Locate(SeqList *L,DataType x){//本地查找一个数字 
	int i=0;
	for(i=0;i<L->length;i++){
		if(x == L->data[i]){
			return i+1;
		}
	}
	return 0;
}

5、插入操作

int InsElem(SeqList *L,int i,DataType x){//在某一位上插入一个数值 
	int j;
	if(L->length == SIZE){
		printf("顺序表已满!");
		return 0; 
	}
	if(i<1||i>L->length+1){
		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;
}

请听口诀:要插先看满,位置合理否,先移后插,再自增

6、删除操作

int DelElem(SeqList *L,int i,DataType *x){
	int j;
	if(L->length == 0){
		printf("顺序表为空!\n");
		return 0;
	}
	if(i<0||i>L->length){
		printf("不存在第%d位元素\n",i);
		return 0;
	}
	*x = L->data[i-1];
	for(j=i;j<L->length;j++){
		L->data[j-1] = L->data[j];
	}
	L->length--;
	printf("\n删除完成\n");
	return 1;
}

请听口诀:要删先看空,删位合理否,先删后移,再自减;
其实相对较难理解的就是插入操作和删除操作、针对这两个模块,首先逻辑要清晰,要么重点理解移位操作!!!(这里实际操作就可有多种)

7、输出

void MyPrintf(SeqList *L){		//显示顺序表内容 
	int i;
	for(i=0;i<L->length;i++){
		printf("%d\t",L->data[i]);
	}
	printf("\n");
}

8、显示菜单函数

void Menu(){
	printf("\t\t顺序表的各种操作\n");
	printf("======================================\n");
	
	printf("\t1——建立顺序元素\n");
	printf("\t2——插入元素\n");
	printf("\t3——删除元素\n");
	printf("\t4——按位置查找元素\n");
	printf("\t5——按元素值查找元素在表中的位置\n");
	printf("\t6——求顺序表的长度 \n");
	printf("\t0——返回\n");
	printf("======================================\n");
	printf("请输入菜单号(0-6):\n");
}

9、完整的顺序表(静态)操作

其实就是通过while 循环 和 switch 选择语句将函数的调用及其操作在主函数里人性化处理

int main() {
	SeqList list;
	int i;
	DataType a,n;
	char ch1,ch2,b='a';
	ch1 = 'y';
	while(ch1=='y'||ch1=='Y'){
		Menu();
		scanf("%c",&ch2);
		getchar();
		switch(ch2){
			case '1':
				IntList(&list);//初始化顺序表
				printf("请输入建立线性表的个数:");
				scanf("%d",&a);
				CreatList(&list,a);
				printf("建立的线性表为:");
				MyPrintf(&list); 
				break;
			case '2':
				printf("请输入要插入的位置:"); 
				scanf("%d",&i);
				printf("请输入要插入的元素值:");
				scanf("%d",&n);
				if(InsElem(&list,i,n)){
					printf("已经成功在第%d位上插入%d,插入后的线性表是:",i,n);
					MyPrintf(&list); 
				}else{
					printf("输入插入参数出错!\n");
				}
				break;
			case '3':
				 printf("请输入要删除元素的位置:");
				 scanf("%d",&i);
				 if(DelElem(&list,i,&a)){
				 	printf("已成功在%d上删除元素%d\n",i,a);
				 	MyPrintf(&list); 
				 }else{
				 	printf("输入删除参数出错!\n");
				 }
				 break;
			case '4':
				printf("请输入需要查找的元素位置(从1开始):");
				scanf("%d",&i);
				if(GetElem(&list,i,&a)){
					printf("当前线性表的第%d个元素是%d\n",i,a);
				}else{
					printf("查找输入的位置参数出错\n");
				}
				break;
			case '5':
				 printf("请输入需要查找的元素:");
				 scanf("%d",&n);
				 if(Locate(&list,n)){
				 	printf("查找元素值为%d的位置为:%d\n",n,Locate(&list,n));
				 }else{
				 	printf("该表中无此元素\n");
				 }
				 break;
			case '6':
				printf("当前线性表的长度为:%d\n",list.length);
				break;
			case '0':
				ch1 ='n';
				printf("退出程序!!!\n");
				break;
			default :
				printf("输入有误,请输入0-6之间的数字!\n");
		}
		if(ch2 != '0'){
//			getchar();
//			printf("\n按r/R键结束,按任意键返回主菜单!\n");
//			scanf("%c",&b);
//			if(b == 'R'||b== 'r'){
//				ch1 = 'n';
//			}
			getchar();
			printf("\n按回车键继续/结束,按任意键返回主菜单!\n");
			scanf("%c",&b);
			getchar();
			if(b == '\xA'){
				ch1 = 'n';
			}
		}
	
	}
	return 0;
}

本程序代码仅供大家参考和我对学习的据结构的一个成长记录,内容有不足欠妥之处还望对阿牛多多包涵,共同探讨。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

勇敢*牛牛

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

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

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

打赏作者

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

抵扣说明:

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

余额充值