实战数据结构线性表之顺序存储

5 篇文章 0 订阅
2 篇文章 0 订阅

大一下学期学习了数据结构,开始学的时候很懵逼,由于结构体等有些知识在大一上学期草草带过,知识积累不足,导致有些看不懂,上机课即使照着打代码依旧不能顺利运行程序。虽然《数据结构–用C语言描述》–耿国华,这本书给出了大部分代码,但是没有给出主函数调用,问题在于同一个结构里的不同函数给出的代码调用形式不统一,导致初学者不懂得怎么调用。

问题就是图上内容,这一段话理解倒是不难,但是实际操作起来会有很大的差别。而当书本上同时出现的时候,我完全傻了,怎么试都是错误的。
算法2.1中将L定义为SeqList 类型的变量,如果后面都用此方法问题不大。但是,问题来了,到了什么不懂的小白身上如果风格不统一,那么这对他来说是个无法发现的大问题在这里插入图片描述
在这里插入图片描述
就像《数据结构–用C语言描述》–耿国华这本书中一样,前面是将L定义为SeqList 类型的变量,后面就变成了指针变量。所以我还有很多同学都很懵逼。

哎!自己菜是原罪。
在这里插入图片描述
在这里插入图片描述
明白问题所在之后我就统一了类型,全都使用第一种方式。(第二种试过无数次都没成功,希望有大佬看到能教一下)

#include<stdio.h>
#include<stdlib.h>
 #include<malloc.h>
 #include<conio.h>
 #define FALSE 0
 #define TRUE 1
 #define  MAXSIZE 100
 typedef int ElementType;
 typedef struct
 {	
 	ElementType elem[MAXSIZE];		/*线性表占用的数组空间*/	
 	int last;				/*记录线性表最后一个元素在数组elem[ ]的位置(下标值)*/
 	}SeqList;	

SeqList InitList(SeqList L){			/*初始化表*/	
	L.last=-1;				/*空表为-1*/
	return L;
	}

SeqList EnterList(SeqList L){			/*在空表中插入n个元素*/
	int i,n,j;	
	i=L.last;	
	printf("你将输入多少个数:\n");	scanf("%d",&n);	
	printf("请输入:\n");
	for(j=0;j<n;j++){		
		scanf("%d",&L.elem[i+j]);		
		L.last++;	
		};
	return (L);}

SeqList InsList(SeqList L,int i,ElementType e){	/*在位置为i的地方插入e元素*/	
	int k;
	if((i<1)||(i>L.last+2)){		/*判断插入位置是否合法*/		
		printf("插入位置不合法!\n");		
		return (L); 	
		}	
	if((L.last>=MAXSIZE-1)){		
		printf("表已满!\n");
		return (L); 
		}	
	for(k=L.last;k>=i-1;k--){		/*为插入元素移动位置*/		
	L.elem[k+1]=L.elem[k];	
		}	
	L.elem[i-1]=e;				/*数组中,第i个元素的下标为i-1*/	
	L.last++;	
	return (L);
	}

int Locate(SeqList L,ElementType e){		/*查找元素为e的元素*/	
int i=0;	
while((i<=L.last)&&(L.elem[i]==e))
	i++;	
if(i<=L.last)		
	return (i+1);	
else return (-1);}

SeqList DellList(SeqList L,ElementType e){	/*删除元素为e的函数*/	
	int k,i,j=0;	
	while((L.elem[j]!=e)&&(j<=L.last)){	/*查找e元素的位置*/		
		j++;	
		}	
	if(j>L.last){		
		printf("无该e值\n"); 		/*判断所查元素是否存在,不存在输出‘无该e值’*/ 
		}					
	else {	 	 			
		printf("e的位置在i=%d\n",j+1);
	for(k=j;k<=L.last;k++)		
		L.elem[k]=L.elem[k+1];	
		L.last--;
		}	
		return (L);
	}

void PrintList(SeqList L){			/*输出函数,输出顺序表各个元素*/
	int i;	
	if((L.last)<0)		
		printf("表为空!");		/*表为空时输出*/	
	for(i=0;i<L.last;i++){		
	printf("%d ",L.elem[i]);	
		}
	}

int main(){	
	SeqList L;
	ElementType e;	
	int i,k;	
	do{	 	
		printf("输入你的选择:\n"); 	
		printf("1.建立线性表\n");	
		printf("2.添加n个数\n");	
		printf("3.在位置i插入元素e\n");
		printf("4.删除值为e元素,返回i值");	
		printf("5.查找位置为i的元素\n");	
		printf("6.结束程序\n");	
		scanf("%d",&k);	
	switch(k){		
		case 1:{			
			L=InitList(L);			
			PrintList(L);			
			break; 	
			}			
		case 2:{			
			L=EnterList(L);			
			PrintList(L);			
			break;	
			}		
		case 3:{			
			printf("i=?,e=?\n");			
			scanf("%d %d",&i,&e);			
			L=InsList(L,i,e);			
			PrintList(L);						
			break;	
			}		
		case 4:{			
			printf("你要删除元素e为:\n");				
			scanf("%d",&e); 			
			L=DellList(L,e);			
			PrintList(L);	 				
			break;		
			} 	
		}
		}while(k>=1&&k<5);
	return 0;
}

能力有限只能写这些了,这里排版太难了,在程序上复制的代码无法自动换行,一行一行的换。要哭了。如果对你有所帮助,麻烦给个赞!
如果有什么问题欢迎指出,不嫌弃我们也可以相互讨论问题哦。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值