C语言实现顺序表的初始化、增删查改基本功能

C语言实现顺序表的初始化、增删查改基本功能

引言

定义

顺序表是线性表的顺序存储结构。形如A_1 、A_2…….A_n的表,这个表的大小为N;并且,我们称大小为0的表为空表。

原理

<1> 其实顺序表的实现就是简单的数组实现,对表的所有操作都是通过使用数组来实现的。
<2> 顺序表中的第一个元素只有一个后继节点,最后一个元素只有一个前驱节点,中间元素均只有一个前驱节点和一个后继节点。

实现过程及结果

C语言实现顺序表的所有函数操作。

代码

#include<stdio.h>
#include<stdlib.h>

//宏定义
#define MAXSIZE 50
#define ERROR 0

typedef int Elemtype; 

typedef struct 
{
    
    
	Elemtype x[MAXSIZE];
	int length;
}sqlist;

//顺序表的初始化、增删查改以及输出操作函数的声明
void Initlist(sqlist *L);
void Outlist(sqlist *L);
void Insertlist(sqlist *L,int i,Elemtype e);
void Deletelist(sqlist *L,int i);
void Foundlist(sqlist *L,Elemtype e);
void Amendlist(sqlist *L,int i,Elemtype e);

//主函数
void main()
{
    
    
	Elemtype e;
	int i;
	char ch;
	sqlist a;
	int t;
	printf("		《 Welcome to use the founction 》\n");
	printf("	    The founction can offer following service\n");
	printf("		*******Please first Initlist*******\n\n");
	printf("		1、Initlist   ->初始化线性表\n");
	//初始条件:顺序表已存在
	printf("		2、Insertlist ->插入操作\n");
	printf("		3、Deletelist ->删除操作\n");
	printf("		4、Foundlist  ->查找操作\n");
	printf("		5、Amendlist  ->更改操作\n");
	printf("		0、Exitlist   ->退出操作\n\n\n");
	
	do
	{
    
    
		printf("Enter your choice:");
		scanf("%d",&t);

		switch(t)
		{
    
    
		case 1:
			{
    
    
				Initlist(&a);
				Outlist(&a);
			}break;
		case 2:
			{
    
    
				printf("Enter Insert data:");
				scanf("%d",&e);
				printf("Enter the position of Insert:");
				scanf("%d",&i);
				Insertlist(&a,i,e);
				Outlist(&a);
			}break;
		case 3:
			{
    
    
				printf("Enter the position of Delete:");
				scanf("%d",&i);
				Deletelist(&a,i);
				Outlist(&a);
			}break;
		case 4:
			{
    
    
				printf("Enter Found data:");
				scanf("%d",&e);
				Foundlist(&a,e);
			}break;
		case 5:
			{
    
    
				printf("Enter the position of amend:");
				scanf("%d",&i);
				printf("Enter data of amending:");
				scanf("%d",&e);
				Amendlist(&a,i,e);
				Outlist(&a);
			}break;
		case 0:
			{
    
    
				ch = getchar();
			}break;
		}
	}while(t!=0);
	ch = getchar();
}
//初始化操作
void Initlist(sqlist *L)
{
    
    
	int i;
	printf("Enter the length of the List: ");
	scanf("%d",&L->length);
	printf("\n");
	for(i=0;i<L->length;i++)
	{
    
    
		printf("Data %d:",i+1);
		scanf("%d",&L->x[i]);
		printf("\n");
	}
}
//输出操作
void Outlist(sqlist *L)
{
    
    
	int i;
	printf("Output current List:");
	for(i=0;i<L->length;i++)
	{
    
    
		if(i<L->length-1)
		{
    
    
			printf("%d ->",L->x[i]);
		}	
		else
		{
    
    
			printf("%d ",L->x[i]);
		}
	}
	printf("\n");
}
//插入操作
void Insertlist(sqlist *L,int i,Elemtype e)
{
    
    
	int j;
	if(L->length==MAXSIZE)
	{
    
    
		printf("List full!!!!!!\n");
		exit(0);
	}
	if(i<0||i>L->length+1)
	{
    
    
		printf("The position is illegal!!!!!!\n");
		exit(0);
	}
	for(j = L->length-1;j>=i;j--)
	{
    
    
		L->x[j+1]=L->x[j];
	}
	L->x[i]=e;
	L->length++;
}
//删除操作
void Deletelist(sqlist *L,int i)
{
    
    
	int j;
	if(L->length==0)
	{
    
    
		printf("List empty!!!!!!\n");
		exit(0);
	}
	if(i<0||i>L->length+1)
	{
    
    
		printf("The position is illegal!!!!!!\n");
		exit(0);
	}
	for(j = i+1;j<L->length;j++)
	{
    
    
		L->x[j-1]=L->x[j];
	}
	L->length--;
}
//查找操作
void Foundlist(sqlist *L,Elemtype e)
{
    
    
	int j;
	for(j=0;j<L->length;j++)
	{
    
    
		if(L->x[j] == e)
			printf("The element you're looking for is in the %d position\n",j+1);
	}
}
//修改操作
void Amendlist(sqlist *L,int i,Elemtype e)
{
    
    
	if(L->length==0)
	{
    
    
		printf("List empty!!!!!!\n");
		exit(0);
	}
	if(i<0||i>L->length+1)
	{
    
    
		printf("The position is illegal!!!!!!\n");
		exit(0);
	}
	L->x[i] = e;
}

运行结果

在这里插入图片描述

总结

<1> 虽然数组是动态指定的,但是还是需要把表的大小的最大值进行估计。估计的与实际的偏差,也就是所造成的空间浪费。
<2> 倘若表中数据过大,插入和删除操作的时间花费有点昂贵。

上述所谓的空间和时间开销,可以通过线性表的链式存储结构来避免。

猜你喜欢

转载自blog.csdn.net/MZYYZT/article/details/113106289