数据结构 线性表的顺序存储

之前写的那个有点小问题,
  • 未在初始化之前判断线性表是否存在

  • 未在选择后判断线性表是否为空

  • 甚至我那个合并线性表都有错

  • 在自定义函数里面有输入输出语句(此次把它移到主函数里面了)

     果然,我还是个弟弟,写的问题还是多多的,不过不急,慢慢琢磨,等大佬们挑出我的问题再次改正。
    

下面准备重写链表、栈、串、数组、广义表什么的
星期天准备看一本渗透流程,看完发出来。
在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define status int
#define ElemType int
#define ERROR 0
#define OK 1
#define SECONDERROR 2
typedef struct{
	ElemType *elem;
	int length;
	int listsize;
}Sqlist;
void menu();
status judgement(Sqlist );
status initlist(Sqlist &);              //初始化一个线性表
status deletelist(Sqlist &); 			//销毁线性 表 
status clearlist(Sqlist &P); 			//清空线性表 
status emptylist(Sqlist &P); 			//判断是否为空 
status lengthlist(Sqlist &P);			//线性表长度 
status getlist(Sqlist P,int ,int&);		//取特定位置元素 
status locallist(Sqlist P,int ,int &);  //判断元素在线性表中的位置
status priorlist(Sqlist P,int ,int &);  //求前驱
status nextlist(Sqlist P,int ,int &);   //求后继 
status insertlist(Sqlist &,int ,int );  //插入 
status deletenumlist(Sqlist &,int); //删除指定位置元素 
void   viewlist(Sqlist );               //输出元素 
void   sumlist(Sqlist ,Sqlist ,Sqlist &);//合并线性表 
int main()
{
	Sqlist L;
	L.elem=NULL;
	int select,m,n;                                                      
	while(1)
	{
		menu();
		printf("请输入你的选择:");
		scanf("%d",&select);
		if(select<1||select>14) 
		{ printf("超出范围!"); break;} 
		switch(select)
		{
			case 1:
					if(initlist(L)) printf("创建成功!\n");
					else printf("创建失败!\n");
					break;	
			case 2:
					if(judgement(L))
					{
						if(deletelist(L)) 
						printf("销毁成功!\n");		
						break;
					}
					printf("未创建顺序表!\n");
					break;	
			case 3:
					if(judgement(L))
					{
						if(clearlist(L)) 
						printf("重置成功!\n");		
						break;
					}
					printf("未创建顺序表!\n");
					break;	
			case 4:
					if(judgement(L))
					{
						if(lengthlist(L))
						{
							printf("线性表不为空!\n");	
							break;	
						} 
						printf("线性表为空!\n");
						break;	
					}
					printf("未创建顺序表!\n");
					break;	
			case 5:
					if(judgement(L))
					{
						printf("线性表长度为:%d!\n",lengthlist(L));
						break;		
					}
					printf("未创建顺序表!\n");
					break;
			case 6:		
			  		if(judgement(L))
			  		{
						if(lengthlist(L)) 
						{
	  						printf("请输入你要查询数据的位置:\n");	
	 				 		scanf("%d",&m);
	 				 		if(m<0||m>lengthlist(L)) 
	 				 		{
	 				 			printf("查询位置超出长度。\n");
	 				 			break; 
							}
							if(getlist(L,m,n)==0)
							{
								printf("线性表中无此元素。\n");
								break;
							}
							else 
							{
								printf("此元素为%d。\n",n);
								break;
							} 
						}
	 					printf("此为空线性表。\n");
	 					break;	
					}
					printf("未创建线性表!\n"); 
					break;			
			case 7:		
			  		if(judgement(L))
			  		{
						if(lengthlist(L)) 
						{
	  						printf("请输入你要查询的数字:\n");	
	 				 		scanf("%d",&m);
							if(locallist(L,m,n)==0)
							{
								printf("线性表中无此元素。\n");
								break;
							}
							else 
							{
								printf("此元素的位置为%d。\n",n);
								break;
							} 
								 
						}
	 					printf("此为空线性表。\n");
	 					break;	
					}
					printf("未创建线性表!\n"); 
					break;
			case 8:
					if(judgement(L))
			  		{
						if(lengthlist(L)) 
						{
	  						printf("请输入你要查询前驱的位置:\n");	
	 				 		scanf("%d",&m);
							if(m<0||m>lengthlist(L)) 
							{
								printf("查询位置超出范围。\n",n);
								break;	
							}
							else
							{	
								if(m==1) 
								{
									printf("此元素无前驱。\n");
									break;
								}
								priorlist(L,m,n);
								printf("前驱为:%d。\n",n);
								break;
							} 
						}
	 					printf("此为空线性表。\n");
	 					break;	
					}
					printf("未创建线性表!\n"); 
					break;		
			case 9:
					if(judgement(L))
			  		{
						if(lengthlist(L)) 
						{
	  						printf("请输入你要查询后继的位置:\n");	
	 				 		scanf("%d",&m);
							if(m<0||m>lengthlist(L)) 
							{
								printf("查询位置超出范围。\n",n);
								break;	
							}
							else
							{	
								if(m==lengthlist(L)) 
								{
									printf("此元素无后继。\n");
									break;
								}
								priorlist(L,m,n);
								printf("后继为:%d。\n",n);
								break;
							} 
						}
	 					printf("此为空线性表。\n");
	 					break;	
					}
					printf("未创建线性表!\n"); 
					break;
			case 10:
				if(judgement(L))
				{
					
					printf("请输入插入数字,位置:\n");
					scanf("%d %d",&m,&n); 
					if(insertlist(L,m,n)==0)
					{
						printf("插入位置超出范围!\n");
						break; 
					}
					else if(insertlist(L,m,n)==2)
					{
						printf("未成功创建新的线性表!\n");
						break;
					}
					else if(insertlist(L,m,n)==1)
					{
						printf("插入完成!\n");
						break;
					} 
				}
				printf("未创建线性表!\n"); 
				break;
			case 11:
					if(judgement(L))
					{
						if(lengthlist(L))
						{
							printf("请输入你想删除的位置:");
							scanf("%d",m);
							if(deletenumlist(L,m))
							{
								printf("删除完成!\n"); 
								break;
							}
							else 
							{
								printf("删除位置超出范围!\n"); 
								break;
							}	
						} 
						printf("此为空线性表!\n"); 
						break;
					} 
					printf("未创建线性表!\n"); 
					break;
			case 12:		
					if(judgement(L))
					{
						if(lengthlist(L))
						{
	 						viewlist(L);
	 						break;
	 					} 
	 					printf("此为空线性表!\n"); 
	 					break;
	 				} 
	 				printf("未创建线性表!\n"); 
	 				break;
	 		case 13:
	 						Sqlist La;Sqlist Lb;Sqlist L;
							La.elem=(ElemType *)malloc(4*sizeof(ElemType));
							La.length=0;
							La.listsize=4;
							Lb.elem=(ElemType *)malloc(4*sizeof(ElemType));
							La.length=0;
							Lb.listsize=4;
							L.elem=(ElemType *)malloc(8*sizeof(ElemType));
							L.length=8;
							L.listsize=8;
							printf("输入la的4个元素:\n");
							for(int i=0;i<4;i++)
							{							
								scanf("%d",&La.elem[i]);
							}
							La.length=4;
							printf("输入lb的4个元素:\n"); 
							for(int j=0;j<4;j++)
							{
								scanf("%d",&Lb.elem[j]);
							}
							Lb.length=4;
							sumlist(La,Lb,L);
							break;
	  		case 14:
	 				return 0;		
	 		
	 				
	 	} 
	 	          		
	}  
	  
}   
void menu()
{   
	printf("\n"); 
 	printf("1-----初始化一个线性表\n"); 
 	printf("2-----销毁线性表\n"); 
 	printf("3-----清空线性表\n");
 	printf("4-----判断线性表是否为空\n");
 	printf("5-----求线性表长度\n");
 	printf("6-----获取线性表中指定位置元素\n");
 	printf("7-----获取线性表元素的位置\n");
 	printf("8-----求前驱\n"); 
  	printf("9-----求后继\n");
	printf("10-----线 性表指定位置插入元素\n");
 	printf("11-----删除线性表指定位置元素\n");
  	printf("12-----显示线性表\n");
 	printf("13-----合并两个非递减有序的线性表\n");
 	printf("14-----退出,输入一个负数\n");
} 
status judgement(Sqlist P)   //判断选择之前是否有初始化线性表 
{  
  	if(!P.elem) return ERROR;
  	else return OK;
}   
status initlist(Sqlist &P)    //初始化一个线性表
{    
	P.elem=(ElemType *)malloc(LIST_INIT_SIZE *sizeof(ElemType));
 	if(!P.elem)  return ERROR;
  	P.length=0; 
 	P.listsize=LIST_INIT_SIZE;
 	return OK;
} 
status deletelist(Sqlist &P)  //销毁线性表
{ 
 	free(P.elem);
	P.length=0;
	P.listsize=0;
	P.elem=NULL;
	return OK;	
} 
status clearlist(Sqlist &P)  //清空线性表 
{
	P.length=0;
	return OK;
} 
status emptylist(Sqlist &P)  //判断是否为空 
{	
	if(P.length==0)
	return OK;
 	else return ERROR; 
} 
status lengthlist(Sqlist &P)  //求长度 
{
	return P.length;
} 
status getlist(Sqlist P,int m,int &n)  //获取指定位置元素 
{						
		n=P.elem[m-1];
		return OK;
}
status locallist(Sqlist P,int m,int &n)  // 求线性表是否有m  n用来返回所在位置
{ 
	for(int i=0;i<P.length;i++)
	{		
		if(P.elem[i]==m)
		{
			n=i; 
			return OK;			
		}
	} 
	return ERROR;
}
status priorlist(Sqlist P,int m,int &n) // 求m的前驱。  n用来返回元素 
{
	n=P.elem[m-2];
	return OK;
}
status nextlist(Sqlist P,int m,int & n)    // 求m的后继。  n用来返回元素 
{
	n=P.elem[m]; 
	return OK;
} 
status insertlist(Sqlist &P,int m,int n)  //插入元素 
{
	if(n<0||n>lengthlist(P)+1)  //判断插入位置是否超出长度 
	return ERROR;
	if(P.length<P.listsize)   //空间不够重新分配更大的空间 
	{
		P.elem=(ElemType *)realloc(P.elem,(LISTINCREMENT+LIST_INIT_SIZE)*sizeof(ElemType));
		if(!P.elem) return SECONDERROR;
		P.listsize+=LISTINCREMENT;
	} 
	for(int i=lengthlist(P);i>n-1;i--)  //插入位后面的元素后移一位 
	{
		P.elem[i]=P.elem[i-1];
	}
	P.elem[n-1]=m;
	P.length+=1;
	return OK;
} 
status deletenumlist(Sqlist &P,int m) //删除元素 
{
	if(m<0||m>lengthlist(P)-1)
	return ERROR;
	for(int i=m;i<lengthlist(P);i++)//插入位后面的元素前移一位 
	{
		P.elem[i-1]=P.elem[i];
	}
	P.length-=1;
	return OK;
} 
void viewlist(Sqlist P)            //输出线性表 
{
	for(int i=0;i<lengthlist(P);i++)
	{
		printf("%d\t",P.elem[i]);
		
	}
}
void sumlist(Sqlist la,Sqlist lb,Sqlist &lc)   //合并线性表 
{
	int i;int j; 
 	for(i=0;i<lengthlist(la);i++)
	{
		lc.elem[i]=la.elem[i];
	}
	for(i=la.length,j=0;j<lb.length;i++,j++)
	{
 		lc.elem[i]=lb.elem[j];
 	}
 	printf("合并线性表成功.");
 	viewlist(lc);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值