c语言实现顺序表

最近学数据结构的时候看到了有很多的顺序表代码都是伪代码,就连最基本的测试主方法也没有。
这对于新手来说非常的不友好,很多人甚至不知道怎么实现结构(因为代码都不能运行)

下文实现的操作按照李云清版的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);
		}

	  
	 
	
	
	
	
	
	
}
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值