顺序表
#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);
}
[c++]数据结构实验一,顺序表和单链表的基本操作
最新推荐文章于 2024-08-28 13:57:19 发布
文章详细介绍了如何使用C++编程语言实现顺序表和链表的数据结构,包括初始化、元素操作(插入、查找、删除)、打印以及菜单选择功能。

1753

被折叠的 条评论
为什么被折叠?



