数据结构实验(线性表)

数据结构实验(线性表)

一、实验要求

1.1 实验目的
通过实验达到⑴加深对线性表的概念、基本运算的理解;⑵熟练掌握线性表的逻辑结构与物理结构的关系;⑶物理结构采用顺序表,熟练掌握线性表的基本运算的实现。
1.2 线性表基本运算定义
依据最小完备性和常用性相结合的原则,以函数形式定义了线性表的初始化表、销毁表、清空表、判定空表、求表长和获得元素等12种基本运算,具体运算功能定义如下(其中SqList为顺序表的结构类型,OK、ERROR等常量的定义参见附录A)。
⑴ 初始化表:函数名称是InitList(SqList &L);初始条件是线性表L不存在;操作结果是构造空顺序表,返回OK。当L存在时,不需要再次初始化。
注:函数参数L为引用型参数,当函数需要改变线性表的值时,必须使用引用型参数。
⑵ 销毁表:函数名称是DestroyList(SqList &L);初始条件是线性表L已存在;操作结果是销毁线性表L,返回OK。
⑶ 清空表:函数名称是ClearList(SqList &L);初始条件是线性表L已存在;操作结果是将L重置为空表,返回OK。
⑷ 判定空表:函数名称是ListEmpty(SqList L);初始条件是线性表L已存在;操作结果是若L为空表则返回TRUE,否则返回FALSE。
⑸ 求表长:函数名称是ListLength(SqList L);初始条件是线性表已存在;操作结果是返回L中数据元素的个数。
⑹ 获得元素:函数名称是GetElem(SqList L,int i,ElemType &e);初始条件是线性表已存在,1≤i≤ListLength(L);操作结果是用e返回L中第i个数据元素的值,返回OK。如果i越界,返回ERROR。
⑺ 查找元素:函数名称是LocateElem(SqList L,ElemType e);初始条件是线性表已存在;操作结果是返回L中第1个与e相等的数据元素的位置序号,若这样的数据元素不存在,则返回值为0。
⑻ 获得前驱:函数名称是PriorElem(SqList L,ElemType cur_e, ElemType &pre_e);初始条件是线性表L已存在;操作结果是若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的直接前驱,函数返回OK;否则操作失败,返回ERROR,pre_e无定义。
⑼ 获得后继:函数名称是NextElem(SqList L,ElemType cur_e,ElemType &next_e);初始条件是线性表L已存在;操作结果是若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,函数返回值为OK;否则操作失败,返回ERROR,next_e无定义。
⑽ 插入元素:函数名称是ListInsert(SqList &L,int i,ElemType e);初始条件是线性表L已存在,1≤i≤ListLength(L)+1;操作结果是在L的第i个位置之前插入新的数据元素e,返回OK,如果i不正确,返回ERROR;或空间已满,返回OVERFLOW。。
⑾ 删除元素:函数名称是ListDelete(SqList &L,int i,ElemType &e);初始条件是线性表L已存在,1≤i≤ListLength(L);操作结果:删除L的第i个数据元素,用e返回其值,函数返回OK;,如果i不正确,返回ERROR。
⑿ 遍历表:函数名称是ListTraverse(SqList L),初始条件是线性表L已存在;操作结果是依次显示L的每个数据元素。
⒀ (选做)写文件:函数名称是Save(SqList L, char *FIleName),初始条件是线性表L已存在;操作结果是将顺序表中数据写入到一个文件FIleName中。
⒁ (选做)读文件:函数名称是Load(SqList &L, char *FIleName),初始条件是线性表L不存在;操作结果是读入文件FIleName中的数据元素,构造线性表L。

注意各操作中“线性表存在”这个条件,如果线性表存在,则可进行操作(2)~(12),否则应该提示错误信息;如果线性表不存在,则可进行操作(1),否则应该提示错误信息。为了表示这个条件,可对顺序表中长度(length)这个属性进行处理,值为-1表示线性表L不存在,存在时长度(length)的值大于或等于0。

二、源代码

/* Linear Table On Sequence Structure */
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR -1

typedef int status;      //将status定义为类型,用以表示操作是否完成的状态
typedef int ElemType; //数据元素类型定义

#define MAXSIZE 100
typedef struct {  //顺序表(顺序结构)的定义
	ElemType  *elem;
	int length;
}SqList;

/*-----实验需要实现的操作 ---------*/
status InitList(SqList& L);
status DestroyList(SqList& L);
status ClearList(SqList& L);
status ListEmpty(SqList L);
int ListLength(SqList L);
status GetElem(SqList L, int i, ElemType& e);
status LocateElem(SqList L, ElemType e);
status PriorElem(SqList L, ElemType cur, ElemType& pre_e);
status NextElem(SqList L, ElemType cur, ElemType& next_e);
status ListInsert(SqList& L, int i, ElemType e);
status ListDelete(SqList& L, int i, ElemType& e);
status ListTrabverse(SqList L);
/*--------------------------------------------*/

int main(void) {
	SqList L;  int op = 1, ans, i, next, prior, loc; ElemType e, cur; 
	L.length = -1;   //初始时,设置为-1表示线性表不存在,可在后面初始化。
	//未初始化的线性表不能进行基本操作
	while (op) {
		system("cls");	printf("\n\n");
	    printf("      Menu for Linear Table On Sequence Structure \n");
		printf("-------------------------------------------------\n");
		printf("    	  1. InitList      7.  LocateElem\n");//1.初始化  7.按值查找
		printf("    	  2. DestroyList    8.  PriorElem\n");//2.销毁  8.返回前驱
		printf("    	  3. ClearList      9.  NextElem \n");//3.清空  9.返回后继
		printf("    	  4. ListEmpty      10. ListInsert\n");//4.空表  10.插入
		printf("    	  5. ListLength     11. ListDelete\n");//5.表长  11.删除第i个元素
		printf("    	  6. GetElem        12. ListTraverse\n");//6.返回第i个元素  12.遍历线性表
		printf("    	  0. Exit\n");
		printf("-------------------------------------------------\n");
		printf("    请选择你的操作[0~12]:");
		scanf_s("%d", &op);
		switch (op) {
		case 1:
			//printf("\n----IntiList功能待实现!\n");
			if (L.length != -1)
				printf("线性表已经存在,不能重复初始化!\n");
			else {
				InitList(L);
				printf("初始化完成!\n");
			}
			system("pause");
			break;
		case 2:
			//printf("\n----DestroyList功能待实现!\n");
			if (DestroyList(L))
				printf("线性表已销毁!");
			else {
				printf("操作失败!");
			}
			system("pause");
			break;
		case 3:
			//printf("\n----ClearList功能待实现!\n");
			if (L.length == -1)
				printf("线性表不存在,需要初始化!\n");
			else {
				ClearList(L);
				printf("线性表已清空!\n");
			}
			system("pause");
			break;
		case 4:
			//printf("\n----ListEmpty功能待实现!\n");
			if (ListEmpty(L))
				printf("当前线性表为空表!\n");
			else {
				printf("当前线性表不是空表!\n");
			}
			system("pause");
			break;
		case 5:
			//printf("\n----ListLength功能待实现!\n");
			if (L.length == -1)
				printf("线性表不存在,需要初始化!\n");
			else {
				printf("表的长度为:%d", L.length);
			}
			system("pause");
			break;
		case 6:
			printf("请输入要查看表中元素的位置:");
			scanf_s("%d", &i);
			if (GetElem(L, i, e)) {
				printf("当前线性表第%d个元素的值是%d",i,e);
			}
			else {
				printf("输入有误");
			}
			//printf("\n----GetElem功能待实现!\n");
			system("pause");
			break;

		case 7:
			//printf("\n----LocateElem功能待实现!\n");
			printf("请输入表中要查找的元素值:");
			scanf_s("%d",&e);
			loc = LocateElem(L, e);
			if (loc) {
				printf("查询的元素值为%d的位置为%p", e, loc);
			}
			else
			{
				printf("表中无此元素");
			}
			system("pause");
			break;
		case 8:
			//printf("\n----PriorElem功能待实现!\n");
			printf("请输入你需要返回元素的前驱元素:");
			scanf_s("%d",&cur);
			prior = PriorElem(L,cur,e);
			if(prior){
				printf("你要查找的元素前驱为:%d", prior);
			}
			else
			{
				printf("表中无此元素");
			}
			system("pause");
			break;
		case 9:
			//printf("\n----NextElem功能待实现!\n");
			printf("请输入你需要返回元素的后驱元素:");
			scanf_s("%d", &cur);
			next = NextElem(L, cur, e);
			if (next) {
				printf("你要查找的元素前驱为:%d", next);
			}
			else
			{
				printf("表中无此元素");
			}
			system("pause");
			break;
		case 10:
			//printf("\n----ListInsert功能待实现!\n");
			printf("请输入要插入的位置:");
			scanf_s("%d", &i);
			getchar();
			printf("请输入你要插入的元素值:");
			scanf_s("%d",&e);
			if (ListInsert(L, i, e)) {
				printf("成功在%d位置上插入%d元素", i, e);
			}
			else
			{
				printf("输入的参数错误!");
			}
			break;
		case 11:
			//printf("\n----ListDelete功能待实现!\n");
			printf("请输入要删除的位置:");
			scanf_s("%d", &i);
			if (ListDelete(L,i,e)) {
				printf("成功在%d位置上删除%d元素", i, e);
			}
			else
			{
				printf("输入的参数错误!");
			}
			system("pause");
			break;
		case 12:
		   //printf("\n----ListTrabverse功能待实现!\n");
		   //printf("\n----ListTrabverse功能待实现!\n");
			if (L.length == -1)
				printf("线性表不存在,需要初始化!\n");
			else ListTrabverse(L);
			system("pause");

			break;
		case 0:
			break;
		}//end of switch
	}//end of while
	printf("欢迎下次再使用本系统!\n");
	return 1;
}//end ofmain()
/*--------page 23 on textbook --------------------*/
status InitList(SqList& L)
{
	L.elem = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE);//动态申请空间
	if (L.length != -1)   //线性表已经存在,不能初始化,否则丢失已有数据
		return ERROR;
	L.length = 0;
	return OK;           //初始化成功,返回成功标记
}
status ListTrabverse(SqList L)
{
	int i;
	if (L.length > 0)    //线性表非空
	{
		printf("\n-----------all elements -----------------------\n");
		for (i = 0; i < L.length; i++) printf("%d ", L.elem[i]);
		printf("\n------------------ end ------------------------\n");
	}
	else printf("空线性表\n");
	return L.length;
}
status DestroyList(SqList& L) 
{
	if(L.elem)delete L.elem;//释放储存空间
    return OK;
}
status ClearList(SqList& L) 
{
	L.length = 0;//将L重置为空表
	return OK;
}
status ListEmpty(SqList L)
{
	if (L.length == 0)//判断表是否为空
		return TRUE;//存在返回true
	else return FALSE;//否则返回false
}
status ListLength(SqList L)
{
	if (L.elem)//判断表存在
		return L.length;//存在返回表长
}
status GetElem(SqList L, int i, ElemType& e)
{
	if (i < 1 || i > L.length) return FALSE;//判断i的值是否合理,若不合理,返回FALSE
	else e = L.elem[i - 1];//数组下标从0开始
	return OK;
}
status LocateElem(SqList L, ElemType e)
{
	int i;
	for (i = 0; i < L.length; i++)    //遍历表
		if (e == L.elem[i])return i + 1;//找到元素,返回位置
	return FALSE;
}
status PriorElem(SqList L, ElemType cur, ElemType& pre_e)
{
	int i;
	if (!L.elem)return FALSE;//元素为空返回FALSE
	else
	{
		for (i = 0; i < L.length; i++)//遍历寻找cur
			if (cur == L.elem[i])
				break;//如果找到退出循环
	}
	if (i == 1)return FALSE;//如果元素在第一个则无前驱返回FALSE
	else
	{
		pre_e = L.elem[i - 1];//返回cur的前驱
		return pre_e;
	}
	
	
}
status NextElem(SqList L, ElemType cur, ElemType& next_e)
{
	int i;
	if (!L.elem)return FALSE;//元素为空返回FALSE
	else 
	{
		for (i = 0; i < L.length; i++)//遍历寻找cur
			if (cur == L.elem[i])
				break;//如果找到退出循环
	}
	if (i == L.length)return FALSE;//如果元素在最后一个则无后继返回FALSE
	else 
	{
		next_e = L.elem[i + 1];//返回cur的后继
		return next_e;
	}
}
status ListInsert(SqList& L, int i, ElemType e)
{
	if (i<1 || i>L.length + 1) return FALSE;//判断i的值是否合理,若不合理,返回FALSE
	if (L.length == MAXSIZE)return FALSE; //判断储存空间是否已满
	for (int j = L.length - 1; j >= i - 1; j--)
		L.elem[j + 1] = L.elem[j];//插入位置及之后的元素后移
	L.elem[i - 1] = e;//将新元素放在第i个位置
	L.length++;//表长加1
	return OK;
}
status ListDelete(SqList& L, int i, ElemType& e)
{
	if (i < 1 || i > L.length)return FALSE;//判断i的值是否合理,若不合理,返回FALSE
	e = L.elem[i - 1];
	for (int j = i; j <= L.length; j++)
		L.elem[j - 1] = L.elem[j];//将被删除元素之后的元素前移
	L.length - 1;//表长减1
	return OK;
}

时间匆忙有些功能并未测试

当然可以!线性表是一种常见的数据结构,它是由一组具有相同数据类型的元素组成的数据集合,这些元素按照线性的顺序排列。下面是一个简单的线性表的代码示例: ```python class LinearList: def __init__(self): self.data = [] # 用列表来存储线性表的元素 def is_empty(self): return len(self.data) == 0 def length(self): return len(self.data) def get_element(self, index): if index < 0 or index >= len(self.data): return None return self.data[index] def insert_element(self, index, element): if index < 0 or index > len(self.data): return False self.data.insert(index, element) return True def delete_element(self, index): if index < 0 or index >= len(self.data): return False del self.data[index] return True ``` 上述代码定义了一个名为`LinearList`的类,其中包含了常见的线性表操作方法。具体来说,这个类包括以下几个方法: - `__init__`:初始化线性表对象,创建一个空列表来存储元素。 - `is_empty`:判断线性表是否为空,即列表是否为空。 - `length`:返回线性表的长度,即列表中元素的个数。 - `get_element`:获取指定位置的元素值,如果索引越界则返回`None`。 - `insert_element`:在指定位置插入一个元素,如果索引越界则插入失败。 - `delete_element`:删除指定位置的元素,如果索引越界则删除失败。 这只是一个简单的线性表代码示例,际应用中可能还需要根据具体需求进行扩展和优化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值