基于顺序存储结构的线性表实现-数据结构C语言

实验名称: 基于顺序存储结构的线性表实现

目录

一、实验目的

二、实验环境安装设置

三、实验任务

四、程序框架

五、程序完整代码

六、程序测试


一、实验目的

  1. 加深对线性表的概念、基本运算的理解;
  2. 熟练掌握线性表的逻辑结构与物理结构的关系;
  3. 物理结构采用顺序表,熟练掌握线性表的基本运算的实现。

二、实验环境安装设置

1. 启动DevCPP在E:建立工作区MyCpp,所有的程序源码都存放在该文件夹下。

三、实验任务

认真研读框架程序,根据提供的实验框架(框架可以直接运行),构造一个具有菜单的功能演示系统。根据功能要求实现下面7个线性表操作操作,约定下面i位置从1开始:

void ListInitiate(SeqList*L);//初始化线性表

int ListLength(SeqList*L);//求线性表的长度,返回线性表L中数据元素个数

int ListInsert(SeqList*L,int i, DataType x);//第i位置插入元素x,插入成功返回SUCCESS,否则FAIL

int ListDelete(SeqList*L,int i); //删除表中第i个元素,删除成功返回SUCCESS,否则FAIL

int ListSearch(SeqList*L,DataType x);//查找表中元素x的位置,查找成功返回位置,否则返回-1

void Print_SeqList(SeqList*L);//用(a1,a2,a3,...,an)个格式输出线性表

int ListGet(SeqList *L, int i, DataType*px);//取第i个元素,成功返回SUCCESS并把元素放入*px,查找失败返回FAIL

要求在演示系统中实现调用相关函数,完成相应的功能能演示。

四、程序框架

拷贝下面框架代码到开发环境里修改。

//Linear Table On Sequence Structure
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define MAXSIZE  100
#define SUCCESS   0  //成功
#define FAIL    1      //失败
 
typedef int DataType; //数据元素类型定义

typedef struct{  //顺序表(顺序结构)的定义
	DataType elem[MAXSIZE];
	int last;//最后一个元素的位置
}SeqList;

//函数声明
void ListInitiate(SeqList*L);//初始化线性表
int ListLength(SeqList*L);//求线性表的长度,返回线性表L中数据元素个数
int ListInsert(SeqList*L,int i, DataType x);//第i位置插入元素x,插入成功返回SUCCESS,否则FAIL
int ListDelete(SeqList*L,int i); //删除表中第i个元素,删除成功返回SUCCESS,否则FAIL
int ListSearch(SeqList*L,DataType x);//查找表中元素x的位置,查找成功返回位置,否则返回-1 
void ListPrint(SeqList*L);//用(a1,a2,a3,...,an)个格式输出线性表
int ListGet(SeqList *L, int i, DataType*px);//取第i个元素,查找成功返回SUCCESS并把元素放入*px,查找失败返回FAIL 

int main()
{
	SeqList L;  //创建一个线性表 
	
	//生成菜单 
	char sel=' ';
	while(sel!='0')
	{
		
		printf("------线性表(顺序存储结构)演示系统-------\n");
		printf("   版本:1.0   作者:XXXXXX 日期:yyyy-mm-dd\n"); 
		printf("------------------------------------------\n");
		printf("       1.初始化线性表\n");
		printf("       2.查找元素位置\n");
		printf("       3.按位置查找元素\n");
		printf("       4.插入一个元素\n");
		printf("       5.删除一个元素\n");
		printf("       6.显示该线性表\n");
		printf("       7.清空屏幕\n");
		printf("       0.退出系统\n");
		printf("请输入选项[0-7]:"); 
		sel=getch();
		switch(sel)
		{
			case '1':
				printf("初始化线性表操作.\n");
				ListInitiate(&L);
				system("pause"); //按任意键继续 
				break;
			case '2':
				printf("查找元素操作.\n");   
				//... 
				system("pause"); //按任意键继续 
				break;
			case '3':
				printf("按位置查找元素操作.\n");
				//... 
				system("pause"); //按任意键继续 
				break;
			case '4':
				printf("插入一个元素操作.\n");
				//... 
				system("pause"); //按任意键继续 
				break;
			case '5':
				printf("删除一个元素操作.\n");
				//... 
				system("pause"); //按任意键继续 
				break;
			case '6':
				printf("显示线性表操作.\n");
				//... 
				system("pause"); //按任意键继续 
				break;
			case '7':
				system("cls");
				break;
			case '0':
				printf("\n谢谢使用,再见!\n");
				break;
			default:
				printf("您输入的选项不合法,请重新选择!\n");
		}
	}

	return 0;
} 
void ListInitiate(SeqList*L)//初始化线性表
{
	L->last=-1;
}
//完成下面6个函数的定义
//int ListLength(SeqList*L)//求线性表的长度,返回线性表L中数据元素个数
//int ListInsert(SeqList*L,int i, DataType x)//第i位置插入元素x,插入成功返回SUCCESS,否则FAIL
//int ListDelete(SeqList*L,int i) //删除表中第i个元素,删除成功返回SUCCESS,否则FAIL 
//int ListSearch(SeqList*L,DataType x);//查找表中元素x的位置,查找成功返回位置,否则返回-1 
//void ListPrint(SeqList*L);//用(a1,a2,a3,...,an)个格式输出线性表
//int ListGet(SeqList *L, int i, DataType*px);//取线性表第i个元素,成功返回SUCCESS并把元素放入*px,查找失败返回FAIL

五、程序完整代码

//Linear Table On Sequence Structure
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define MAXSIZE  100
#define SUCCESS   0  //成功
#define FAIL 1  //失败

typedef int DataType; //数据元素类型定义
DataType x;
DataType y;
DataType px;

typedef struct {  //顺序表(顺序结构)的定义
	DataType elem[MAXSIZE];
	int last;//最后一个元素的位置
}SeqList;

//函数声明
void ListInitiate(SeqList* L);//初始化线性表
int ListLength(SeqList* L);//求线性表的长度,返回线性表L中数据元素个数
int ListInsert(SeqList* L, int i, DataType x);//第i位置插入元素x,插入成功返回SUCCESS,否则FAIL
int ListDelete(SeqList* L, int i); //删除表中第i个元素,删除成功返回SUCCESS,否则FAIL
int ListSearch(SeqList* L, DataType x);//查找表中元素x的位置,查找成功返回位置,否则返回-1 
void ListPrint(SeqList* L);//用(a1,a2,a3,...,an)个格式输出线性表
int ListGet(SeqList* L, int i, DataType* px);//取第i个元素,查找成功返回SUCCESS并把元素放入*px,查找失败返回FAIL 

int main()
{
	SeqList L;  //创建一个线性表 
	//生成菜单 
	char sel = ' ';
	while (sel != '0')
	{

		printf("------线性表(顺序存储结构)演示系统-------\n");
		printf("   版本:1.0   作者:金春依 日期:2022/03/21\n");
		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("       0.退出系统\n");
		printf("请输入选项[0-8]:\n");
		sel = getchar();
		switch (sel)
		{
		case '1':
			printf("初始化线性表操作->\n");
			ListInitiate(&L);//初始化函数
			ListPrint(&L);//再打印一遍线性表
			system("pause"); //按任意键继续 
			break;
		case '2':
			DataType y;
			printf("查找元素操作->\n");
			printf("请输入要查找的元素:");
			scanf("%d", &y);
			if (ListSearch(&L, y) == -1)
			{
				printf("查找失败\n");
			}
			else
			{
				printf("元素%d当前地址为:<%d>",y, ListSearch(&L, y));
			}
				ListPrint(&L);//再打印一遍线性表
			system("pause"); //按任意键继续 
			break;
		case '3':
			int z;
			printf("按位置查找元素操作->\n");
			printf("请输入要查找的位置:");
			scanf("%d", &z);
			if (ListGet(&L, z, &px) == -1)
			{
				printf("查找失败\n");
			}
			else
			{
				printf("你要查地址为<%d>的当前元素为:%d", z, px);
			}
			ListPrint(&L);//再打印一遍线性表
			system("pause"); //按任意键继续 
			break;
		case '4':
			int i;
			printf("插入一个元素操作->\n");
			printf("请输入要插入的元素和位置:");
			scanf("%d%d", &x,&i);
			ListInsert(&L, i, x);//插入函数
			ListPrint(& L);//再打印一遍线性表
				system("pause"); //按任意键继续 
			break;
		case '5':
			int x;
			printf("删除一个元素操作->\n");
			printf("你要删除第几个元素:\n");
			scanf("%d", &x);
			ListDelete(&L, x);//删除函数
			ListPrint(&L);//再打印一遍线性表
			system("pause"); //按任意键继续 
			break;
		case '6':
			printf("显示线性表操作->\n");
			ListPrint(&L);
			system("pause"); //按任意键继续 
			break;
		case '7':
			system("cls");
			break;
		case '8':
			printf("查看线性表长度->\n");
			printf("线性表的长度为:%d\n", ListLength(&L));
			system("pause"); //按任意键继续 
			break;
		case '0':
			printf("\n谢谢使用,再见!\n");
			break;
		default:
			printf("您输入的选项不合法,请重新选择!\n");
		
		}
	}
	return 0;
}
int ListGet(SeqList* L, int i, DataType *px)
{
	//取线性表第i个元素,成功返回SUCCESS并把元素放入*px,查找失败返回FAIL
	if (L->last <= 0)
	{
		printf("线性表为空\n");
		return FAIL;
	}
	if (i<0 || i> L->last)//线性表里没有这个第i个元素
	{
		printf("参数i不合法 \n");
		return FAIL;
	}
	else
	{
		*px = L->elem[i - 1]; //元素放入* px
		return SUCCESS;
	}
}
void ListInitiate(SeqList* L)//初始化线性表
{
	int m = 0;
	printf("你要申请多少长度的线性表:\n");
	scanf("%d", &m);
	L->last = m;
	for (int i = 0; i < L->last; i++)
	{
		L->elem[i] = i + 1;
	}
	//初始化线性表为:1 2 3 4 5 6 7 8 9 10。。。。。L->last ( m)
}

int ListLength(SeqList* L)//求线性表的长度,返回线性表L中数据元素个数
{
	return L->last ;
}

int ListInsert(SeqList* L, int i, DataType x)//第i位置插入元素x,插入成功返回SUCCESS,否则FAIL
{
	int j;
	if (i<0 || i>L->last )
	{
		printf("参数i不合法 \n");
		return FAIL;
	}
	else if (L->last >= MAXSIZE)
	{
		printf("线性表已满无法插入 \n");
		return FAIL;
	}
	else
	{	
		L->last++;    //线性表长度+1

		for (j = L->last ; j > i-1; j--)
		{
			L->elem[j] = L->elem[j - 1];//i和i后的数据往后移
		}
		L->elem[i-1] = x;   //在线性表第i个位置,即数组下标插入x
		return SUCCESS;
	}
}

void ListPrint(SeqList* L)//用(a1,a2,a3,...,an)个格式输出线性表
{
	printf("\n线性表为:(");//输出(
	int i;
	for (i = 0; i < L->last-1; i++)
	{
		printf("%d,", L->elem[i]);
	}
	if (i == L->last - 1)
	{
		printf("%d", L->elem[i]);
	}
	printf(")\n");	//输出)
}
	
int ListDelete(SeqList* L, int i) //删除表中第i个元素,删除成功返回SUCCESS,否则FAIL 
{
		int j;
		if (i<0 || i> L->last )//线性表里没有这个第i个元素
		{
			printf("参数i不合法 \n");
			return FAIL;
		}
		else if (L->last <= 0)
		{
			printf("线性表已空无法插入 \n");
			return FAIL;
		}
		else
		{
			for (j = i ; j <= L->last; j++)//元素i被删除后,i后面的元素依次往前移
			{
				L->elem[j - 1] = L->elem[j];
			}
			L->last--;//删除元素后,长度-1
			return SUCCESS;
		}
}
 
 
int ListSearch(SeqList* L, DataType x)//查找表中元素x的位置,查找成功返回位置,否则返回-1 
{
    if (L->last <= 0)
	{
		printf("线性表为空\n");
		return FAIL;
	}
	for (int j = 0; j < L->last; j++)
	{
		if (x == L->elem[j])
		{
			return j + 1;
		}
	}
	return FAIL;
}

六、程序测试

需要对所有函数功能进行测试。


版权声明:本文为m0_65601072原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。