数据结构 单链表

上传一些自己数据结构瞎写的作业

实验目的:

  1. 掌握程序设计的基本方法,要求能够对C/C++实现简单的算法设计
  2. 熟练掌握指针的应用
  3. 熟练掌握线性表的基本运算在顺序存储结构和链式存储结构上的实现
  4. 掌握顺序表以及线性链表的基本操作及其实现
  5. 能使用线性表来解决实际中遇到的问题

实验要求:

  1. 单链表:完成初始化、插入、删除、获取、查找、显示、合并等功能

要点:

  1. 操作时不需要移动元素,只需要移动指针
  2. 插入时先将新节点的指针指向下一个节点,再将前驱节点的指针指向新节点
  3. 删除时可以用一个指针指向被删除节点,方便释放内存空间
  4. 在进行查找、获取等操作时,需要从头节点开始按顺序依次遍历各个节点
LinkList.h
#pragma once
#include<iostream>
using namespace std;

typedef int ElemType;

enum Status { ERROR = 0, OK = 1 };

typedef struct LinkList
{
	ElemType et;
	struct LinkList* next;
}LinkList;

ostream& operator<<(ostream& os, LinkList*& L);
Status initLinkList(LinkList*& L);//初始化 链表
Status insertLinkList(LinkList*& L, int i, ElemType e);//插入 链表,位置,内容
Status deleteLinkList(LinkList*& L, int i, ElemType& e);
//删除 链表,位置,接收被删除元素
Status getElem(LinkList*& L, int i, ElemType& e);//获取元素 链表,位置,接收元素
int searchLinkList(LinkList*& L, ElemType& e);
//查找元素 链表,接收元素 返回元素位置,未找到则返回0
Status mergeLinkList(LinkList*& La, LinkList*& Lb, LinkList*& Lc);
//合并 链表La,链表Lb,链表Lc
void insertPart(LinkList*& L);//插入功能
void deletePart(LinkList*& L);//删除功能
void getPart(LinkList*& L);//获取功能
void searchPart(LinkList*& L);//查找功能
void mergePart();//演示合并功能
void menu();//菜单
void choose(LinkList*& L, int& flag);//选择

LinkList.cpp
#include"LinkList.h"
#include<iostream>
using namespace std;

ostream& operator<<(ostream& os, LinkList*& L)
{
	LinkList* p = L;
	if (!(p->next))//只有头节点
	{
		return os << "空表";
	}
	while (p->next)
	{
		p = p->next;//跳过头节点
		os << p->et << " ";
	}
	return os;
}

Status initLinkList(LinkList*& L)//初始化 链表
{
	L = new LinkList;//创建头节点
	L->next = NULL;
	return Status::OK;
}

Status insertLinkList(LinkList*& L, int i, ElemType e)//插入 链表,位置,内容
{
	LinkList* p;
	int j;
	p = L;
	j = 0;
	while (p && j < i - 1)
	{
		p = p->next;
		j++;
	}
	if (!p || j > i - 1)
		return Status::ERROR;
	LinkList* q = new LinkList;
	q->et = e;
	q->next = p->next;
	p->next = q;
	return Status::OK;
}

Status deleteLinkList(LinkList*& L, int i, ElemType& e)
//删除 链表,位置,接收被删除元素
{
	LinkList* p, * q;
	int j;
	p = L;
	j = 0;
	while (p && j < i - 1)
	{
		p = p->next;
		j++;
	}
	if (!p || j > i - 1)
		return Status::ERROR;
	q = p->next;
	p->next = q->next;
	e = q->et;
	delete q;
	return Status::OK;
}

Status getElem(LinkList*& L, int i, ElemType& e)
//获取元素 链表,位置,接收元素
{
	LinkList* p = L;
	int j = 0;
	while (p && j < i)
	{
		p = p->next;
		j++;
	}
	if (!p || j > i)
		return Status::ERROR;
	e = p->et;
	return Status::OK;
}

int searchLinkList(LinkList*& L, ElemType& e)
//查找元素 链表,接收元素 返回元素位置,未找到则返回ERROR
{
	LinkList* p = L->next;
	int j = 1;
	while (p)
	{
		if (p->et == e)
		{
			return j;
		}
		p = p->next;
		j++;
	}
	return 0;
}

Status mergeLinkList(LinkList*& La, LinkList*& Lb, LinkList*& Lc)
//合并 链表La,链表Lb,链表Lc
{
	LinkList* pa = La->next, * pb = Lb->next, * pc = Lc;
	Lc = pc = La;
	while (pa && pb)
	{
		if (pa->et > pb->et)
		{
			pc->next = pb;
			pc = pb;
			pb = pb->next;
		}
		else
		{
			pc->next = pa;
			pc = pa;
			pa = pa->next;
		}
	}
	if (!pa)//Pa为空
	{
		pc->next = pb;
	}
	else
	{
		pc->next = pa;
	}
	delete Lb;
	return Status::OK;
}

void insertPart(LinkList*& L)//插入功能
{
	int i;
	ElemType e;
	cout << "输入插入位置:";
	cin >> i;
	cout << "输入插入内容:";
	cin >> e;
	if (insertLinkList(L, i, e) == Status::OK)
	{
		cout << "插入成功" << endl;
		cout << "插入后的链表:" << L << endl;
	}
	else
		cout << "插入失败" << endl;
	system("pause");
}

void deletePart(LinkList*& L)//删除功能
{
	int i;
	ElemType e;
	cout << "输入删除位置:";
	cin >> i;
	deleteLinkList(L, i, e);
	cout << "删除成功" << endl;
	cout << "删除的数据:" << e << endl;
	cout << "删除后的链表:" << L << endl;
	system("pause");
}

void getPart(LinkList*& L)//获取功能
{
	int i;
	ElemType e;
	cout << "输入获取位置:";
	cin >> i;
	getElem(L, i, e);
	cout << "获取成功" << endl;
	cout << "获取的元素:" << e << endl;
	system("pause");
}

void searchPart(LinkList*& L)//查找功能
{
	int i;
	ElemType e;
	cout << "输入要查找的元素:";
	cin >> e;
	i = searchLinkList(L, e);
	if (i)//i != 0 找到元素
	{
		cout << "找到元素,在第 " << i << " 个位置" << endl;
	}
	else
	{
		cout << "未找到元素" << endl;
	}
	system("pause");
}

void mergePart()//演示合并功能
{
	LinkList* La, * Lb, * Lc;
	initLinkList(La);
	initLinkList(Lb);
	initLinkList(Lc);
	cout << "演示合并链表" << endl;
	for (int i = 1; i <= 9; i += 2)
	{
		insertLinkList(La, (i + 1) / 2, i);
		insertLinkList(Lb, (i + 1) / 2, i + 1);
	}
	cout << "La " << La << endl << "Lb " << Lb << endl;
	mergeLinkList(La, Lb, Lc);
	cout << "合并后:Lc " << Lc << endl;
	system("pause");
}

void menu()//菜单
{
	system("cls");
	cout << "选择功能" << endl;
	cout << "1、插入" << endl;
	cout << "2、删除" << endl;
	cout << "3、获取" << endl;
	cout << "4、查找" << endl;
	cout << "5、演示合并链表" << endl;
	cout << "0、退出" << endl;
}

void choose(LinkList*& L, int& flag)//选择
{
	int choice;
	cout << "选择:";
	cin >> choice;
	switch (choice)
	{
	case 1:
		insertPart(L);
		break;
	case 2:
		deletePart(L);
		break;
	case 3:
		getPart(L);
		break;
	case 4:
		searchPart(L);
		break;
	case 5:
		mergePart();
		break;
	case 0:
		flag = 0;
		break;
	default:
		cout << "输入错误" << endl;
		system("pause");
		break;
	}
}

main.cpp
#include<iostream>
#include"LinkList.h"
using namespace std;

int main()
{
	LinkList* L;
	int flag = 1;
	initLinkList(L);

	while (flag)
	{
		menu();
		choose(L, flag);
	}

	return 0;
}


插入
错误插入
删除
获取
查找
查找
合并
错误输入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值