线性表-顺序存储结构(一)

1.不分配存储空间的写法

​#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 30           //线性表存储空间初始分配量 
#define OK 1
#define ERROR 0

typedef struct{
	int data[MAXSIZE];       //数组存储数据元素 
	int length;              //线性表当前长度 
}Sqlist; 
//建表
void creat_list(Sqlist *L){
	int i;
	printf("input n=");      //n表示length的长度 
	scanf("%d",&L->length);
	for(i=0;i<L->length;i++){
		printf("data[%d]=",i);
		scanf("%d",&L->data[i]);   //输入n个数值 
	}
	printf("\n");
} 
//输出表 
void print_list(Sqlist *L){
	int i;
	printf("The datas of list is :\n");
	for(int i=0;i<L->length;i++){
	   printf("data[%d]=%d",i,L->data[i]);
	   printf("\n");
	}
}
//返回表的长度 
int length_list(Sqlist *L){
	int i=0;
	i=L->length;
	printf("The length of list is %d\n",i);
	return OK;
}
//取出表中的第i个元素
int  get_data_list(Sqlist *L,int i){
	if(L->length==0 || i<1 || i>L->length)
	   return ERROR;
	return L->data[i-1];
}
//在第i个位置前插入一个元素e 
int insert_front_list(Sqlist *L,int i,int e){
	int a;
	if(L->length==MAXSIZE){
		printf("it is error!\n");
	}
	if(i<1 || i>L->length+1){
		printf("it is error!\n");
	} 
	if(i<=L->length+1){
		for(a=L->length-1;a>=i-1;a--)
		   L->data[a+1]=L->data[a];
		L->data[i-1]=e;
		L->length++;
		return OK;
	}
}
//在第i个位置后插入一个元素e 
int insert_last_list(Sqlist *L,int i,int e){
	int a;
	if(L->length==MAXSIZE){
		printf("it is error!\n");
	}
	if(i<0 || i>L->length){
		printf("it is error!\n");
	} 
	if(i<=L->length){
		for(a=L->length-1;a>i-1;a--)
		   L->data[a+1]=L->data[a];
		L->data[i]=e;
		L->length++;
		return OK;
	}
}
//删除第i个位置前的元素,返回删除的值 
int delete_front_list(Sqlist *L,int i,int e){
	if(L->length==0){
		printf("it is error!\n");
	}
	if(i<=1 || i>L->length+1){
		printf("it is error!\n");
	}
	if(i<=L->length+1){
		e=L->data[i-2];
		printf("The data of delete is %d\n",e);
		for(int m=i-1;m<=L->length;m++)
		   L->data[m-1]=L->data[m];
		L->length--;
		return OK;
	}
} 
//删除第i个位置后的元素,返回删除的值 
int delete_last_list(Sqlist *L,int i,int e){
	if(L->length==0){
		printf("it is error!\n");
	}
	if(i<0 || i>L->length-1){
		printf("it is error!\n");
	}
	if(i<L->length){
		e=L->data[i];
		printf("The data of delete is %d\n",e);
		for(int m=i;m<L->length-1;m++)
		   L->data[m]=L->data[m+1];
		L->length--;
		return OK;
	}
}
//查找相同元素的下标
int equal_list(Sqlist *L,int e){
	printf("The location of equal data is");
	for(int i=0;i<L->length;i++)
		if(L->data[i]==e)
			printf("%4d",i);
	printf("\n");   
	return OK; 
} 
//两个链表的合并
int La_and_Lb_list(Sqlist *La,Sqlist *Lb,Sqlist *Lc){
	int e,a; //两表中相同的数据元素的声明 
	int count;//计数器
	int m;
	m=La->length;//进行Lc的长度表示 
	Lc->length=La->length+Lb->length;
	for(int i=0;i<La->length;i++)
		Lc->data[i]=La->data[i]; 
	for(int i=0;i<Lb->length;i++){
		e=Lb->data[i];
		for(int j=0;j<La->length;j++){
			if(e==La->data[j]){
				a=j;
				count=1; 
				break;
			} 
		}
		if(count==1){ 
			Lc->data[a]=e;
			Lc->length--;
			count=0;
		} 
		else
			Lc->data[m++]=e;
	}
	return OK;
} 
//主函数 
int main(){
	Sqlist L;//定义一个表 
	creat_list(&L);
	printf("\t-----------------------1.表的长度-----------------------\n");
	printf("\t-----------------------2.打印表-------------------------\n");
	printf("\t-----------------------3.取出一个元素-------------------\n");
	printf("\t-----------------------4.位置前插入元素-----------------\n");
	printf("\t-----------------------5.位置后插入元素-----------------\n"); 
	printf("\t-----------------------6.位置前删除元素-----------------\n");
	printf("\t-----------------------7.位置后删除元素-----------------\n");
	printf("\t-----------------------8.相同元素下标的查找-------------\n");
	printf("\t-----------------------9.两个链表的合并-----------------\n");
	while(1){
		int m;
		printf("m=");//选择项 
		scanf("%d",&m);
		switch(m){
			case 1:length_list(&L);break;
			case 2:{
				print_list(&L);
				length_list(&L);
				printf("\n");
				break;
			}
			case 3:{
				int n;
				printf("The location of data is ");
               	scanf("%d",&n);
	            printf("取出的元素为:%d\n",get_data_list(&L,n));
	            print_list(&L);
	            length_list(&L);
	            printf("\n");
				break;
			}
			case 4:{
			    length_list(&L);
				int n;
				printf("The location of insert is ");//插入的位置 
               	scanf("%d",&n);
               	int data;
				printf("data is : ");
				scanf("%d",&data);   //插入的数 
				insert_front_list(&L,n,data);
				print_list(&L);
				length_list(&L); 
				printf("\n");
				break;
			}
			case 5:{
				length_list(&L);
				int n;
				printf("The location of insert is ");//插入的位置 
               	scanf("%d",&n);
               	int data;
				printf("data is : ");
				scanf("%d",&data);   //插入的数 
				insert_last_list(&L,n,data);
				print_list(&L);
				length_list(&L); 
				printf("\n");
				break;
			} 
			case 6:{
				length_list(&L);
				int n,e;
				printf("The location of insert is ");//删除的位置 
               	scanf("%d",&n);
				delete_front_list(&L,n,e);
				print_list(&L);
				length_list(&L); 
				printf("\n");
				break;
			}
			case 7:{
				length_list(&L);
				int n,e;
				printf("The location of insert is ");//删除的位置 
               	scanf("%d",&n);
				delete_last_list(&L,n,e);
				print_list(&L);
				length_list(&L); 
				printf("\n");
				break;
			} 
			case 8:{
				length_list(&L);
				int e;
				printf("The data is ");//输入的元素,根据其找出相同元素的位置
				scanf("%d",&e);
				equal_list(&L,e);
				printf("\n"); 
				break;
			}
			case 9:{
				Sqlist Lb,Lc;
				creat_list(&Lb);
				La_and_Lb_list(&L,&Lb,&Lc);
				length_list(&Lc);
				print_list(&Lc);
				printf("\n");
				break;
			}
		}
	}
	return 0;
}​

2.分配空间的写法

/*--------------------------------------------------------------------------------*/
/*----------------------------------表的操作--------------------------------------*/
/*--------------------------表的顺序操作(顺序存储结构)--------------------------*/
/*---------------------------顺序表的插入、删除和修改-----------------------------*/
/*--------------------------------------------------------------------------------*/ 

#include<stdio.h>
#include<stdlib.h>
#define MAX 100
#define LIST_LENGTH 10
#define OK 1
#define ERROR 0
//表的存储结构
typedef struct{
	int data[MAX];
	int length;
}SqList;
//建立空表 
int InitList(SqList *L)
{
	L=(SqList *)malloc(sizeof(SqList));//创建空间时,需注意为指针 
	L->length=0;
	return OK;
} 
//返回当前表的长度 
 void LengthList(SqList L)
 {
 	printf("表的长度为:\n");
 	printf("%d",L.length);
 }
 //输出元素 
 void OutputList(SqList L)
 {
 	printf("请输出顺序表元素:\n");
	for(int i=0;i<L.length;i++)
		printf("%d ",L.data[i]);
	printf("\n"); 
 }
//插入一个数
void  InsertList(SqList L,int i,int e,int length)//a为当前表的长度 
{
	if(i<length+1||i>=1){
		for(int k=length;k>=i-1;k--)
			L.data[k+1]=L.data[k];
	}
	L.data[i-1]=e;
	L.length=length+1;
	OutputList(L);
	LengthList(L);
 } 
 //删除一个数
 void DeleteList(SqList L,int i,int length)
 {
 	int e;
 	if(i<1||i>length)
 		printf("ERROR!");
 	e=L.data[i-1];
 	printf("删除的值为:%d\n",e);
	for(int k=i-1;k<length;k++)
		L.data[k]=L.data[k+1];
	L.length=length-1;
	OutputList(L);
	LengthList(L);
  } 
 //修改一个数
 void XiugaiList(SqList L,int i,int e,int length)//i为修改的位置,e为修改的值 
 {
 	if(i<1||i>length)
 		printf("ERROR!");
 	int a;
 	a=L.data[i-1];
 	printf("原来的值:%d\n",a);
 	printf("修改以后的值:%d\n",e);
 	L.data[i-1]=e;
 	printf("修改以后表的值----");
    OutputList(L);
	LengthList(L); 
  } 
int main(){
	SqList L;
	if(!InitList(&L))
	{
		printf("初始化失败!");
	}
	int a;
	printf("对顺序表进行赋值.\n");
	printf("input the numbers of a : ");
	scanf("%d",&a);
	printf("请输入顺序表元素:\n");
	for(int i=0;i<a;i++)
		scanf("%d",&L.data[i]);
	L.length=a;
	OutputList(L);
	LengthList(L);
	printf("\n");	
	printf("----------------------------------------------------------\n");
	printf("-------------------1.表的初始化!-------------------------\n");
	printf("-------------------2.插入操作!---------------------------\n");
	printf("-------------------3.删除操作!---------------------------\n");
	printf("-------------------4.修改操作!---------------------------\n");
	printf("----------------------------------------------------------\n");
	while(1){
	int b;
	printf("\n"); 
	printf("输入选择值为:");
	scanf("%d",&b);
	printf("\n");
	switch(b){
		case 1:  
			{
				OutputList(L);
				LengthList(L);
				printf("\n");
				break;		
			}
		case 2:
			{
				int inp,wei;
				printf("插入的位置为:");
				scanf("%d",&wei);
				printf("插入的数为:");
				scanf("%d",&inp);
				InsertList(L,wei,inp,a);
				printf("\n");
				break;
			}
		case 3:
			{
				int inpu;
				printf("删除的位置为:");
				scanf("%d",&inpu);
				DeleteList(L,inpu,a);
				printf("\n");
				break;
			}
		case 4:
			{
				int xiu,gai;
				printf("修改的位置为:");
				scanf("%d",&xiu);
				printf("修改的数值为:");
				scanf("%d",&gai);
				XiugaiList(L,xiu,gai,a);
				printf("\n");
				break; 
			}
 		}
	}
	return 0;
}

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值