顺序表:逻辑上连续,物理结构上也连续

实现一个具有“增、删(根据位置删除,根据元素删除)、查、初始化、输入、打印”等简单功能的顺序表:

源码:

头文件部分("sequence.h"):

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<stdlib.h>
#define MAXSIZE 20
typedef int ElemType;
typedef struct
{
	ElemType data[MAXSIZE];
	int last;
}SeqList;

void creat(SeqList *L);                               //创建顺序表

int InsertSList(SeqList  *L, int i, int x);          //在i位置插入x

int DeleteList(SeqList  *L, int i);                 //删除i位置的元素

int GetData(SeqList *L, int  x);                          //查找值为x的下标

int GetLength(SeqList *L);           //求顺便长度

int InitSList(SeqList *L);       //初始化顺序表,释放整个顺表

void output(SeqList * L);                 //打印整个顺序表

void reverse_list(SeqList *L);        //反转整个顺序表

void sortrank(SeqList *L);                  //对顺序表进行排序




//封装函数部分("sequence.c"):

#include"sequence.h"
void creat(SeqList *L)                          //创建一个顺序表
{
	printf("请输入顺序表:\n");
	for (int n = 0; n <= L->last; n++)
	{
		scanf("%d", &(L->data[n]));
	}
	printf("输入成功\n");
}

int InsertSList(SeqList  *L, int i, int x)         //将x插入到i位置上,成功返回1
{
	if ((i<1) || i>(L->last + 2))
		return -1;
	if ((L->last) == (MAXSIZE - 1))
		return -1;
	for (int n = L->last; n >= i - 1; n--)
		L->data[n + 1] = L->data[n];
	L->data[i - 1] = x;
	L->last++;
	return 1;
}

int DeleteList(SeqList  *L, int i)                     //删除i位置上的元素,成功返回1
{
	if ((i > L->last + 1) || (i < 1))
		return -1;
	if (L->last == -1)
		return -1;
	for (int n = i - 1; n <L->last; n++)
	{
		L->data[n] = L->data[n + 1];
	}
	L->last--;
	return 1;
}

int GetData(SeqList *L, int  x)                      //查找x元素的所在的位置
{
	int i = 0;
	if (L->last<0)
		return -1;
	while (i <= L->last)
	{
		if (L->data[i] == x)
			return i + 1;
		i++;
	}
	return -1;
}

int GetLength(SeqList *L)                           //求取表的长度
{
	return (L->last + 1);
}

int InitSList(SeqList *L)                          //初始化顺序表,将当前顺序表释放
{
	L->last = -1;
	return 1;
}

void output(SeqList * L)                   //打印顺序表
{
	if (L->last==-1)
	{
		printf("请先创建顺序表\n");
	}
	else
	{
		for (int n = 0; n <= L->last; n++)
			printf("%d  ", L->data[n]);
		printf("\n");
	}
}

void reverse_list(SeqList *L)
{
	if (L->last == -1)
		printf("请先创建顺序表\n");
	else
	{
		ElemType *left = L->data;
		ElemType *right = left + L->last;
		while (left<right)
		{
			ElemType tmp = *left;
			*left = *right;
			*right = tmp;
			left++;
			right--;
		}
		printf("逆序成功\n");
	}
}

void sortrank(SeqList *L)                               //对顺序表进行排序
{
	ElemType tmp;
	int i = 0;
	int j = 0;
	for (i = 0; i <= L->last; i++)
	{
		for (j = 0; j <(L->last - i); j++)
		{
			if (L->data[j]>L->data[j + 1])
			{
				tmp = L->data[j];
				L->data[j] = L->data[j + 1];
				L->data[j + 1] = tmp;
			}
		}
	}
	printf("排序成功\n");
}



主函数部分:

#include"sequence.h"

int main()
{
	int m = 0;
	int n = 0;
	int i = 0;
	int ret=0;
	ElemType x;
	SeqList L;
	L.last = -1;
	printf("***********************************************\n");
	printf("***********************************************\n");
	printf("********0.exit             1.Creat*************\n");
	printf("********2.InsertSList      3.ListDelete********\n");
	printf("********4.FindData         5.GetLength*********\n");
	printf("********6.InitSList        7.output************\n");
	printf("********8.ReverseList      9.Sortrank**********\n\n\n");
	while (1)
	{
		printf("请选择功能:  ");
		scanf("%d", &n);
		switch (n)
		{ 
		 case 0:
			 exit(1);
			 break;
		 case 1:
			 while (1)
			 {
				 printf("请输入顺序表长度:");
				 scanf("%d", &L.last);
				 if (L.last < 1)
					 printf("输入无效,请重新输入\n");
				 else
					 break;
			 }
			 L.last = L.last - 1;
			 creat(&L);
			 break;
		 case 2:
			 printf("请输入要插入的位置:  和要插入的元素:\n");
			 scanf("%d%d", &i, &x);
			 ret = InsertSList(&L, i, x);
			 if (ret == 1)
				 printf("插入成功\n");
			 else
				 printf("插入失败\n");
			 break;
		 case 3:
			 printf("****1、位置删除   2、元素删除****\n");
			 printf("请选择删除方式:");
			 while (1)
			 {
				 scanf("%d", &m);
				 if (m==1||m==2)
					 break;
				 else
					 printf("选择无效,请重新选择\n");
			 }
			 switch (m)                                     //开始执行删除的方式
			 {
			 case 1:
			 {
					   printf("请输入要删除的位置:");
					   scanf("%d", &i);
					   ret = DeleteList(&L,i);
					   break;
			 }
			 case 2:
			 {
					   int i = 0;
					   printf("输入要删除的元素:");
					   scanf("%d", &x);
					   while (1)
					   {
						   i = GetData(&L, x);
						   if (i ==-1)
							   break;
						   ret =DeleteList(&L, i);
					   }
					   break;
			  }                                                        //删除结束
			 }
				 if (ret == 1)
					 printf("删除成功\n");
				 else
					 printf("删除失败\n");
			 break;
		 case 4:
			 printf("请输入要查找的元素:");
			 scanf("%d",&x);
			 ret=GetData(&L,x);
			 if (ret==-1)
				 printf("查询无果\n");
			 else	 
		         printf("查找成功:%d\n",ret);
			 break;
		 case 5:
			 ret=GetLength(&L);
			 printf("顺序表长度:%d\n", ret);
			 break;
		 case 6:
			 InitSList(&L);
			 printf("初始化成功\n");
			 break;
		 case 7:
			 printf("打印顺序表:");
			 output(&L);
			 break;
		 case 8:
			 reverse_list(&L);
			 break;
		 case 9:
			 sortrank(&L);
			 break;
		 default:
			 printf("选择无效,请重新选择\n");
			 break;
		}
			 ret = 0;
	}
	system("pause");
	return 0;
}