[c++]数据结构实验一,顺序表和单链表的基本操作

文章详细介绍了如何使用C++编程语言实现顺序表和链表的数据结构,包括初始化、元素操作(插入、查找、删除)、打印以及菜单选择功能。
顺序表
#include <iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define MAXSIZE 100
#define List_Increment 10
typedef int ElemType;
typedef struct
{
	ElemType* elem;
	int length;
	int listsize;
}SqList;
//顺序表初始化
int InitList_Sq(SqList& L)
{
	L.elem = new ElemType[MAXSIZE]; 
	if (!L.elem)
	{
		exit(OVERFLOW);  
	}
	L.length = 0;
	L.listsize = 0;
	return OK;
}
//输入元素
void CreateList(SqList& L) 
{
	int n;
	cout << "请输入数据个数" << endl;
	cin >> n;
	for (int i = 0 ; i < n; i++)
	{
		cout << "请输入第" << i+1 << "个数据" << endl;
		cin >> L.elem[i];
		L.length++;
	}
}
//插入元素,表满扩容
int ListInsert_Sq(SqList& L, int i, ElemType e)
{
	if (i < 1 || i > L.length + 1)
	{
		return ERROR;
	}
	if (L.length >= L.listsize)
	{
		SqList newbase;
		newbase.elem = (ElemType*)realloc(L.elem, (L.listsize + List_Increment) * sizeof(ElemType));
		if (newbase.elem == NULL)
		{
			exit(OVERFLOW);
		}
		L.elem = newbase.elem;
		L.listsize = L.listsize + List_Increment;
	}
	for (int j = L.length - 1; j >= i - 1; --j)
	{
		L.elem[j + 1] = L.elem[j];
	}
	L.elem[i - 1] = e;
	++L.length;
	return OK;
}
//获取第i个元素
int GetElem_Sq(SqList L, int i, ElemType& e)
{
	if (( i < 1 ) || ( i > L.length ))
	{
		return ERROR;
	}
	e = L.elem[i-1];
	return OK;
}
//删除第i位元素
int ListDelete_Sq(SqList& L, int i, ElemType& e)
{
	if ((i < 1) || (i > L.length))
	{
		return ERROR;
	}
	e = L.elem[i - 1];
	for (int j = i; j <= L.length - 1; j++)
	{
		L.elem[j - 1] = L.elem[j];
	}
	--L.length;
	return OK;
}
//查找元素位置(1)
int LocateElem(SqList L, ElemType e)
{
	for (int i = 0; i < L.length; i++) 
	{
		if (L.elem[i] == e) 
		{
			cout << "该元素位置为" << i + 1 << endl;
			return OK;
		}
	}
	cout << "未找到该元素位置" << endl;
	return ERROR;
}
//清空线性表(2)
void ClearList(SqList& L) 
{
	L.length = 0;
}
//打印
int ListPrint_Sq(SqList L)
{
	if (L.length)
	{
		for (int i = 0; i < L.length; i++)
		{
			cout << "第" << i+1 << "个元素是";
			cout << L.elem[i] << endl;
		}
	}
	else
	{
		cout << "该表为空表" << endl;
		return ERROR;
	}
	return OK;
}
//菜单+选择
int OperateMenu()
{
	int Input = 0;
	cout << "**********************" << endl;
	cout << "———请选择操作———" << endl;
	cout << "———0.退出—————" << endl;
	cout << "———1.插入—————" << endl;
	cout << "———2.查找元素———" << endl;
	cout << "———3.删除—————" << endl;
	cout << "———4.打印—————" << endl;
	cout << "———5.查找位置———" << endl;
	cout << "———6.清空—————" << endl;
	cout << "**********************" << endl;
	cin >> Input;
	return Input;
}
//操作提醒
void InFer(int Infer)
{
	if (Infer)
	{
		cout << "操作成功" << endl;
	}
	else
	{
		cout << "操作失败" << endl;
	}
}
//操作选择
void Operates(SqList& L)
{
	int flag = 1;
	while (flag)
	{
		flag = OperateMenu();
		int Infer, i;
		ElemType e;
		switch (flag)
		{
			//在指定位置插入数据
		case 1:
			cout << "请输入插入位置" << endl;
			cin >> i;
			cout << "请输入插入数据" << endl;
			cin >> e;
			Infer = ListInsert_Sq(L, i, e);
			InFer(Infer);
			break;

			//获取数据
		case 2:
			cout << "请输入查找位置" << endl;
			cin >> i;
			Infer = GetElem_Sq(L, i, e);
			if (Infer) 
			{
				cout << "该数据为" << e << endl;
			}
			InFer(Infer);
			break;

			//删除指定位置数据
		case 3:
			cout << "请输入删除位置" << endl;
			cin >> i;
			Infer = ListDelete_Sq(L, i, e);
			if (Infer)
			{
				cout << "删除数据为" << e << endl;
			}
			InFer(Infer);
			break;

			//打印
		case 4:
			Infer = ListPrint_Sq(L);
			InFer(Infer);
			break;

			//查找指定元素的位置
		case 5:
			cout << "请输入要查找位置的元素" << endl;
			cin >> e;
			Infer = LocateElem(L, e);
			InFer(Infer);
			break;
			//清空线性表
		case 6:
			ClearList(L);
			cout << "已清空" << endl;
			break;
		}
	}
	if (flag == 0)
	{
		cout << "已退出" << endl;
	}
}
int main()
{
	SqList L;
	L.elem = NULL;
	InitList_Sq(L);
	CreateList(L);
	Operates(L);
	return 0;
}


单链表
#include <iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define MAXSIZE 100
#define List_Increment 10
typedef int ElemType;
typedef struct LNode {
	ElemType data;
	struct LNode* next;
}LNode, * LinkList;
 //链表初始化(即建立一个空链表)
void InitList_L(LinkList& L)
{
	L = new LNode;
	L ->data = NULL;
	L->next = NULL;
}
//尾插法
void CreateList_L(LinkList& L, int n)
{ 
	L = new LNode;
	L->next = NULL;
	LinkList p,r = L;
	for (int i = 0; i < n; ++i) {
		p = new LNode; 
		cout << "请输入第" << i+1 << "个元素" << endl;
		cin >> p->data ; 
		p->next = NULL;
		r->next = p; 
		r = p; 
	}
}
//获取第i个结点数据
int GetElem_L(LinkList L, int i, ElemType& e)
{
	LinkList p = L->next; 
	int j = 1;
	while (p && j < i)
	{
		p = p->next; 
		++j;
	}
	if (!p || j > i) 
	{
		return ERROR;
	}
	e = p->data;
	return OK;
}
//在第i位置插入
int ListInsert_L(LinkList& L, int i, ElemType e)
{ 
	LinkList s,p = L;
	int j = 0;
	while (p && j < i - 1)
	{
		p = p->next;
		++j;
	}
	if (!p || (j > i - 1))
	{
		return ERROR; 
	}
	s = new LNode;
	s ->data = e;
	s->next = p->next;
	p->next = s;
	return OK;
}
//删除第i个结点
int ListDelet_L(LinkList& L, int i, ElemType& e)
{
	LinkList q,p = L;
	int j = 0;
	while (p->next && j < i - 1)
	{
		p = p->next; ++j;
	}
	if (!(p->next) || j > i - 1)
	{
		return ERROR;
	}
	q = p->next; 
	p->next = q->next;
	e = q->data;
	free(q);
	return OK;
}
//清空(1)保留头结点,指针域为NULL
void ListClear(LinkList &L) 
{
	LinkList p;
	while(L -> next)
	{
		p = L->next;
		L->next = p->next;
		free(p);
	}
}
//销毁(2)头结点一起释放
void DestroyList(LinkList& L)
{
	LinkList p = L;
	while(p)
	{
		L = L->next;
		free(p);
		p = L;
	}
}
//打印
int ListPrint_L(LinkList L)
{
	LinkList p = L->next;
	int i = 1;
	//如果 链表 L 不空
		//则 利用循环语句对表 L 中的所有元素依次输出;
	//否则 提示为空表
		if (!L->next)
		{
			cout << "该表为空表" << endl;
			return ERROR;
			
		}
		while (p)
		{
			cout << "第" << i << "个数据是";
			cout << p->data <<endl;
			p = p->next;
			i++;
		}
		cout << endl;
		return OK;
}
//菜单
int OperateMenu()
{
	//输出初始的用户操作界面的提示信息;
	//接收用户输入的操作代码;
	//return 操作代码变量的值;
	int Input = 0;
	cout << "**********************" << endl;
	cout << "———请选择操作———" << endl;
	cout << "————0.退出————" << endl;
	cout << "————1.插入————" << endl;
	cout << "————2.查找————" << endl;
	cout << "————3.删除————" << endl;
	cout << "————4.打印————" << endl;
	cout << "————5.初始化———" << endl;
	cout << "————6.清空————" << endl;
	cout << "————7.销毁————" << endl;
	cout << "**********************" << endl;
	cin >> Input;
	return Input;
}
//操作反馈
void InFer(int Infer) 
{
	if (Infer)
	{
		cout << "操作成功" << endl;
	}
	else
	{
		cout << "操作失败" << endl;
	}
}
//操作内容
void Operates(LinkList& L) 
{
	int flag = 1;
	while (flag)
	{
		flag = OperateMenu();
		int Infer, i;
		ElemType e;
		switch (flag)
		{
			//在指定位置插入新元素
		case 1:
			cout << "请输入插入位置" << endl;
			cin >> i;
			cout << "请输入插入数据" << endl;
			cin >> e;
			Infer = ListInsert_L(L, i, e);
			InFer(Infer);
			break;

			//获取指定位置元素
		case 2:
			cout << "请输入查找位置" << endl;
			cin >> i;
			Infer = GetElem_L(L, i, e);
			cout << "该数据为" << e << endl;
			InFer(Infer);
			break;

			//删除指定位置元素
		case 3:
			cout << "请输入删除位置" << endl;
			cin >> i;
			Infer = ListDelet_L(L, i, e);
			cout << "删除数据为" << e << endl;
			InFer(Infer);
			break;

			//打印
		case 4:
			Infer = ListPrint_L(L);
			InFer(Infer);
			break;

			//初始化
		case 5:
			InitList_L(L);
			break;
			//清除链表
		case 6:
			ListClear(L);
			break;
			//销毁链表
		case 7:
			DestroyList(L);
			break;
		}
	}
	if (flag == 0)
	{
		cout << "已退出" << endl;
	}
}
void main()
{
	LinkList L;
	InitList_L(L);
  L == NULL;
	int n;
	cout << "请输入链表元素个数" << endl;
	cin >> n;
	CreateList_L(L,n);
	Operates(L);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值