最近学数据结构的时候看到了有很多的顺序表代码都是伪代码,就连最基本的测试主方法也没有。
这对于新手来说非常的不友好,很多人甚至不知道怎么实现结构(因为代码都不能运行)
下文实现的操作按照李云清版的c语言数据结构实现(差异是作者自己的风格)
#include<stdio.h>
#include <cstdlib>
typedef int datatype; //这里是声明一种新的元素 int,你将他命名成datatype。这样的好处是方便修改这种类型的精度,只需要修改这句就可以了
#define maxsize 100
typedef struct{
int size;
datatype a[maxsize];
}sequence_list;
void inint(sequence_list *slt)//将表置为空
{
slt->size=0;
printf("你已经成功的清理了表!\n");
}
void append(sequence_list *slt,datatype x)//添加数据 .这是从后部插入
{
if(slt->size==maxsize)
{
printf("这个表是满的不能插入了!\n");
}
slt->a[slt->size]=x;
slt->size=slt->size+1;
printf("你已经成功插入了元素\n");
}
void print(sequence_list *slt)//打印数据
{
if(!slt->size)
{
printf("这个表是空的");
}
for(int i=0;i<slt->size;i++)
{
if(i==slt->size-1)
{
printf("%d ",slt->a[i]);
}
else
printf("%d-> ",slt->a[i]);
}
}
int find(sequence_list *slt,datatype x)//这里返回的是一个int类型的数据。
{
int i=0;
while(i<slt->size&&slt->a[i]!=x)
i++;
return(i<slt->size? i:-1); //这里的意思是如果i小于slt.size。那么返回i,如果i!=1,那么返回-1
}
datatype get(sequence_list *slt,int i)//这是之前定义的数据类型,获取第i个节点上的数字
{
if(i<0||i>=slt->size)
{
printf(" 这个节点不存在!");
}
else
{
printf("这个节点上的元素是 %d",slt->a[i]);
}
}
int empty(sequence_list *slt)
{
if(slt->size==0)
{
printf("这是一个空的链表\n");
}
else
printf("这个链表的长度是 %d\n",slt->size);
}
void insert(sequence_list *slt,datatype x,int position)//在某个位置插入数值
{
int i;
if(slt->size==maxsize)
{
printf("这个表满了,你不能插入!\n");
}
if(position<0||position>slt->size)
{
printf("这个位置不存在!\n");
return ;
}
for (i=slt->size;i>position;i--)
slt->a[i]=slt->a[i-1];//插入一个元素的话,其余的元素要往后移。于是原本i的位置就变成了i-1的东西
slt->a[position]=x;
slt->size++;
printf("插入成功\n");
printf("现在展示插入后的数据\n");
print(slt);
printf("\n");
}
void dele(sequence_list *slt,int position)
{
int i;
if(slt->size==0)
{
printf("线性表是空的不能删除\n");
}
if(position<0||position>slt->size)
{
printf("这个位置不存在!\n");
}
for (i=slt->size;i>position;i--)
slt->a[i]=slt->a[i+1];//删除一个元素的话,其余的元素要往前移。于是原本i的位置就变成了i+1的东西
slt->size--;
printf("现在展示删除后的数据\n");
print(slt);
}
int p;
int x;
int o;
int f;
int position;
int position1;
datatype w;//注意一下变量不要重复使用,由于没有重新清除,你直接赋值的话可能是个脏变量/
datatype q;
int main(){
//printf("%d\n",l.a[1]);//.适用于结构体变量,->适用于结构体指针变量!
int choose;
while(1){
printf("*****************************************\n");
printf("* *\n");
printf("* 线性表的顺序表示和实现: *\n");
printf("* *\n");
printf("* 1. 构造一个空的线性表 *\n");
printf("* 2. 对线性表进行赋值 *\n");
printf("* 3. 查找线性表里是否存在某个数字 *\n");
printf("* 5. 判断线性表是否为空 *\n");
printf("* 7. 获取线性表某一位置对应的元素 *\n");
printf("* 8. 在线性表某一位置插入元素 *\n");
printf("* 9. 删除线性表某一位置的元素 *\n");
printf("* 12. 打印线性表 *\n");
printf("* 13. 退出 *\n");
printf("* *\n");
printf("*****************************************\n");
printf("请做出您的选择:");
scanf("%d",&choose);
sequence_list l;
switch(choose)
{
case (1):
inint(&l);
break;
case (2):
printf("请输入你要插入的节点个数\n");
scanf("%d",&x);
for(int k=0;k<x;k++)
{
printf("请输入第%d个节点的数据\n",k+1);
scanf("%d",&w);
append(&l,w);
}
break;
case (3):
printf("请输入你想找到的数据的值\n");
scanf("%d",&o);
p=find(&l,o);//这里还要接收一下传回来的数据
if(p==-1)
{
printf("对不起,没有找到这个数据\n");
}
else
{
printf("这个数据的位置是在第%d个节点 \n",p+1);
}
break;
case (5):
empty(&l);
break;
case 7:
printf("请输入你想查找节点的的位置\n");
scanf("%d",&f);
get(&l,f);
break;
case (8):
printf("请输入你想插入节点的的位置\n");
scanf("%d",&position);
printf("请输入你想插入的元素\n" );
scanf("%d",&q);
insert(&l,q,position);
break;
case (9):
printf("请输入你想删除的元素的位置\n" );
scanf("%d",&position1);
dele(&l,position1);
case (12):
printf("这是线性表现在的样子\n");
print(&l);
break;
case 13:
exit(0);
}
}
}