大一下学期学习了数据结构,开始学的时候很懵逼,由于结构体等有些知识在大一上学期草草带过,知识积累不足,导致有些看不懂,上机课即使照着打代码依旧不能顺利运行程序。虽然《数据结构–用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;
}
能力有限只能写这些了,这里排版太难了,在程序上复制的代码无法自动换行,一行一行的换。要哭了。如果对你有所帮助,麻烦给个赞!
如果有什么问题欢迎指出,不嫌弃我们也可以相互讨论问题哦。