c语言线性表-顺序表(完整版)

c语言线性表顺序存储表示

这几天我尝试写写c语言顺序表,我是这样想的:在学链表之前,先搞懂顺序表。
不喜勿喷,本人新手,大多代码借鉴书上。如有错误之处,请原谅!
首先创建一个结构体:

typedef struct
{
	ElemType *elem;//存储空间的基地址 
	int length;//当前长度 
}Sqlist;//顺序表的结构类型为Sqlist 

然后建立一个空表,并填上数据:

Status InitList(Sqlist &L)//建立一个空表 
{
	L.elem = new ElemType[MAXSIZE];
	if(!L.length)
	{
		exit(OVERFLOW);//OVERFLOW需要重定义
	}
	L.length = 0;
	return 0;
}

顺序表结构至此已经搭建好了,下一步便是往空表上填数据。

Status MyList(Sqlist &L)//在空表上输入数字,建立一个属于自己填写的表 
{
	int b,i=0;
	printf("表的长度: ");
	scanf("%d",&L.length);
	Interrupt(); 
	printf("输入要填入表的数字:\n");
	for( ; i < L.length ; i++ )
	{
		scanf("%d",&b);	
		L.elem[i] = b;		
	}
	Interrupt(); 
	return 0;
}

剩下的工作,便是对自己所创建的顺序表进行修改,装饰。
顺序表操作包括:增,删,查。
为了观察输入的顺序表是否正确,先增加个 遍历函数

Status TraverseList(Sqlist &L)//遍历 ,使现有表中的数据重新打印出来 
{
	int j;
	if(L.length==0)
	{
		printf("空表\n");
		return 0;
	}
	else
	{
		for(j=0 ; j < L.length ; j++)//建立一个for函数,读取顺序表中的数据 
			printf("%d  ",L.elem[j]);
		printf("\n");//最后换行 
		return 0;
	}
}

顺序表的取值(按值查找):

Status GetElem(Sqlist &L,int i,int &e)//取值 。i:为要取的值得位置,&e:为i位置的接受变量,并且返回主函数 
{
	scanf("%d",&i);
	Interrupt();
	if(i<0||i>L.length)//判断i的取值是否超范围 
	{
		printf("ERROR\n");//如果超范围,返回ERROR,并结束 
		return 0;
	}
	else
	{
		e = L.elem[i-1];//返回将第i位置的数据赋值给e,并输出 
		printf("%d\n",e);
		return 0;
	}
}

顺序表的删除操作:

Status DeleteElem(Sqlist &L,int i)//删除 。i:为要删除数据的位置 
{
	int j;
	scanf("%d",&i);//输入要删除的第i位 
	Interrupt();
	if(i<0||i>L.length)//判断输入的i 是否超范围,如果超出,返回错误。 
	{
		printf("ERROR\n");
		return 0;
	}
	else
	{
		for(j = i; j<=L.length;j++)//被删除元素之后的元素都向前移一位 
			L.elem[j-1] = L.elem[j];
		L.length = L.length-1;//表长减1 
		return 0;
	}
}

顺序表的插入:

Status ListInsert(Sqlist &L,int i,ElemType e)//顺序表的插入  i:为要插入的表的位置。e:要插入该位置的元素 
{
	int j;
	scanf("%d",&i);
	scanf("%d",&e);
	Interrupt();
	if(i>L.length+1||L.length>=MAXSIZE||i<1)//判断要插入表的位置i是否超出范围 
	{
		printf("ERROR\n");
		return 0;
	}
	else
	{
		for(j=L.length;j>=i;j--)//插入位置及之后的元素分别向后移一位 
			L.elem[j]=L.elem[j-1];
		L.elem[i-1]=e;//将新元素e放入第i个位置 
		++L.length;//表长加1 
		return 0;
	}
}

顺序表的查找(按位查找):

Status LocateElem(Sqlist &L,ElemType e)//查找。在顺序表L中查找值为e的数据元素 
{
	int j,i=0;
	bool text=true;//利用bool类型,来判断表里有没有值为e的值 
	scanf("%d",&e);//输入e的值 
	Interrupt();
	for(j=0;j<L.length;j++)//遍历整个顺序表,和e值一一作比较, 
	{
		if(L.elem[j]==e)
		{
			printf("第 %d 位\n",j+1);
			i++;
			text=false;
		}
	}

	if(text)//bool类型的输出 
		printf("没有找到");
	return 0;
}

最后附上 完整代码c语言顺序表 存储结构。主函数中为了方便操作增加了一些代码。

#include 
#include 
#include 
#define MAXSIZE 100//顺序表所能表达的最大长度 
#define OVERFLOW 1



typedef int Status;//重命名,使Status和int有相同的作用
typedef int ElemType;

void Interrupt(void)//创建一个中断函数 
{
	while(1) //用于检测换行符,使函数脱离scanf的连续输出 
		if(getchar()=='\n')
			break;
}

typedef struct
{
	ElemType *elem;//存储空间的基地址 
	int length;//当前长度 
}Sqlist;//顺序表的结构类型为Sqlist 

Status InitList(Sqlist &L)//建立一个空表 
{
	L.elem = new ElemType[MAXSIZE];
	if(!L.length)
	{
		exit(OVERFLOW);
	}
	L.length = 0;
	return 0;
}

Status MyList(Sqlist &L)//在空表上输入数字,建立一个属于自己填写的表 
{
	int b,i=0;
	printf("表的长度: ");
	scanf("%d",&L.length);
	Interrupt(); 
	printf("输入要填入表的数字:\n");
	for( ; i < L.length ; i++ )
	{
		scanf("%d",&b);	
		L.elem[i] = b;		
	}
	Interrupt(); 
	return 0;
}

Status TraverseList(Sqlist &L)//遍历 ,使现有表中的数据重新打印出来 
{
	int j;
	if(L.length==0)
	{
		printf("空表\n");
		return 0;
	}
	else
	{
		for(j=0 ; j < L.length ; j++)//建立一个for函数,读取顺序表中的数据 
			printf("%d  ",L.elem[j]);
		printf("\n");//最后换行 
		return 0;
	}
}

Status GetElem(Sqlist &L,int i,int &e)//取值 。i:为要取的值得位置,&e:为i位置的接受变量,并且返回主函数 
{
	scanf("%d",&i);
	Interrupt();
	if(i<0||i>L.length)//判断i的取值是否超范围 
	{
		printf("ERROR\n");//如果超范围,返回ERROR,并结束 
		return 0;
	}
	else
	{
		e = L.elem[i-1];//返回将第i位置的数据赋值给e,并输出 
		printf("%d\n",e);
		return 0;
	}
	
}

Status DeleteElem(Sqlist &L,int i)//删除 。i:为要删除数据的位置 
{
	int j;
	scanf("%d",&i);//输入要删除的第i位 
	Interrupt();
	if(i<0||i>L.length)//判断输入的i 是否超范围,如果超出,返回错误。 
	{
		printf("ERROR\n");
		return 0;
	}
	else
	{
		for(j = i; j<=L.length;j++)//被删除元素之后的元素都向前移一位 
			L.elem[j-1] = L.elem[j];
		L.length = L.length-1;//表长减1 
		return 0;
	}
}

Status ListInsert(Sqlist &L,int i,ElemType e)//顺序表的插入  i:为要插入的表的位置。e:要插入该位置的元素 
{
	int j;
	scanf("%d",&i);
	scanf("%d",&e);
	Interrupt();
	if(i>L.length+1||L.length>=MAXSIZE||i<1)//判断要插入表的位置i是否超出范围 
	{
		printf("ERROR\n");
		return 0;
	}
	else
	{
		for(j=L.length;j>=i;j--)//插入位置及之后的元素分别向后移一位 
			L.elem[j]=L.elem[j-1];
		L.elem[i-1]=e;//将新元素e放入第i个位置 
		++L.length;//表长加1 
		return 0;
	}
}

Status LocateElem(Sqlist &L,ElemType e)//查找。在顺序表L中查找值为e的数据元素 
{
	int j,i=0;
	bool text=true;//利用bool类型,来判断表里有没有值为e的值 
	scanf("%d",&e);//输入e的值 
	Interrupt();
	for(j=0;j<L.length;j++)//遍历整个顺序表,和e值一一作比较, 
	{
		if(L.elem[j]==e)
		{
			printf("第 %d 位\n",j+1);
			i++;
			text=false;
		}
	}

	if(text)//bool类型的输出 
		printf("没有找到");
	return 0;
}

int main()
{
	int a,i=0; 
	char c;
	Sqlist L;//将L定义为Sqlist类型的变量,便于直接引用 
	InitList(L); 
	MyList(L);
	TraverseList(L);
	printf("操作输入序号选择:\n 1:遍历顺序表\n 2:顺序表取值\n 3:删除元素\n 4:插入元素\n 5:顺序表查找\n 6:表长\n输入#退出\n");	
	while(1)
	{
		int f = 0;
		printf("请选择:"); 
		scanf("%c",&c);
		Interrupt();
		switch(c)
		{
			case '1': printf("遍历顺序表: ");TraverseList(L); break;
			case '2': printf("顺序表取值(取值位置): ");GetElem(L, a , a ); break;
			case '3': printf("删除元素(删除的位置): ");DeleteElem(L,a); break;
			case '4': printf("插入元素(位置 插入的元素): ");ListInsert(L,a,a); break;
			case '5': printf("顺序表查找(输入要查找的元素): ");LocateElem(L,a); break;
			case '6': printf("表长: %d \n",L.length); break;
			case '#': f = 1; break;
			default: printf("ERROR\n");
		}
		if (f == 1) 
		{
			printf("已正常退出!\n");
			break;
		}
	}
	
	return 0;
}

(完)

你可能感兴趣的:(c语言,数据结构,c语言,数据结构,链表,顺序表)