线性表顺序存储和链式存储

一、本周学习内容:
对线性表的顺序存储结构和链式存储结构进行了算法实现,并对其区别进行分析比较。
顺序存储:

#include <iostream>
#define MAXSIZE 20
using namespace std;
typedef int Datatype;
typedef class ListNode List;

class ListNode
{
public:
	ListNode() ;
	~ListNode() {};
	void CreateList();//创建
	void Length();//长度
	void FindAtData();//按值查找该值下标
	void FindAtSub();//按下标查找该下标的值
	void Insert();//在表中下标的地方插入数据
	void Delete();//在表中删除下标的元素
	void TravalList();//遍历输出
private:
	Datatype data[MAXSIZE];
	int length;
};

ListNode::ListNode()
{
	Datatype data = 0;
	length = 0;
}
//创建
void ListNode:: CreateList()
{
	do
	{
		cout << "输入长度(0-" << MAXSIZE << "):";
		cin >> length;
	} while (length<0 || length>MAXSIZE);//输入不符合做循环
	if (length == 0)//长度为0,不输入直接返回
	{
		return;
	}
	cout << "输入线性表:";
	for (int i = 0; i < length; i++)
	{
		cin >> data[i];
	}
	return ;
}

//长度
void ListNode::Length()
{
	cout << "长度为:"<< length<<endl;
	return;
}
//按值查找,输出该值下标
void ListNode:: FindAtData( )
{
	Datatype x;
	cout << "输入要查找的值:";
	cin >> x;
	int i=0;
	if (length == 0)//长度为0

		cout << "表为空" << endl;
	else
	{
		while (i <length && data[i] != x)//遍历次数超过长度或找到该值退出循环
			i++;
		if (i >= length)
			cout<<"表中没有该值,查找失败"<<endl;
		else
			cout<<x<<"在线性表的下标为:"<<i<<endl;
	}
	return;
}
//按下标查找,输出该下标所在的值
void ListNode:: FindAtSub()
{
	int i;//下标
	cout << "请输入下标:";
	cin >> i;
	if (i < 0 || i >= length)//位置越界
		cout << "输入错误,查找失败" << endl;
	else
		cout << "下标" << i << "的值为:" << data[i] << endl;
		return;
}
//插入
void ListNode:: Insert()
{
	Datatype x;
	int i;
	cout << "输入要插入的数据:";
	cin >> x;
	cout << "输入插入位置的下标:";
	cin >> i;
	if (length == MAXSIZE)//位置已满
	{
		cout << "表满,插入失败" << endl;
		return;
	}
	if (i < 0 || i > length)//位置越界
	{
		cout << "输入错误,插入失败" << endl; 
		return;
	}
	for (int j=length-1; j >= i; j--)//从最后依次往后挪
	{
		data[j+1] = data[j];
	}
	data[i] = x;
	length++;//长度+1
	return;
}
//删除
void ListNode:: Delete()
{
	int i;//下标
	cout << "输入要删除位置的下标:";
	cin >> i;
	if (length == 0)//长度为0
	{
		cout << "表为空,删除失败" << endl;
		return;
	}
	if (i < 0 || i >= length)//位置越界
	{
		cout << "输入错误,删除失败" << endl;
		return;
	}
	for (int j = i; j < length-1; j++)//从i后一个开始依次往前挪
		data[j] =data[j + 1];
	length--;
	return;
}
//遍历
void ListNode:: TravalList()
{
	if (length == 0)
		cout << "表为空" << endl;
	else
	{
		cout << "线性表序列为:";
		for (int i = 0; i < length; i++)
		{
			cout << data[i]<<" ";
		}
		cout << endl;
	}
	return;
}

int main()
{
	int i;
	List L;
	cout << "1.创建顺序表; 2.查询长度; 3.按值查找下标; 4.按下标查找值; 5.插入; 6.删除; 7.遍历; 0.退出"<<endl;
	do
	{
		cout << "请输入操作:";
		cin >> i;
		switch (i)
		{
		case 1:
		{
			
			L.CreateList(); break;
		}
		case 2:L.Length(); break;
		case 3:L.FindAtData(); break;
		case 4:L.FindAtSub(); break;
		case 5:L.Insert(); break;
		case 6:L.Delete(); break;
		case 7:L.TravalList(); break;
		default:break;
		}
	} while (i != 0);
	return 0;
}

运行界面:
在这里插入图片描述
链式存储:

#include <iostream>
using namespace std;
typedef int Datatype;
//链表节点
class Node
{
public:
	Datatype data;
	Node* next;
};
//单链表
class LinkList
{
public:
	LinkList();//构建单链表
	~LinkList();//销毁单链表
	void CreateLinkList(int n);//创建长度为n的单链表
	void TravalLinkList();//遍历单链表
	int GetLength();//链表长度
	bool IsEmpty();//判断是否为空
	Node* FindNode(Datatype data);//查找节点
	void InsertNodeAtHead(Datatype data);//在头部插入
	void InsertNodeAtEnd(Datatype data);//在尾部插入
	void InsertNodeAtPoint(Datatype data, int n);//在指定点插入
	void DeleteNodeAtHead();//删除头部
	void DeleteNodeAtEnd();//删除尾部
	void DeleteNodeAtPoint(Datatype data);//删除指定的数据
	void DeleteAll();//全部删除
private:
	Node* head;
};
//初始化
LinkList::LinkList()
{
	head = new Node;
	head->data = 0;
	head->next = NULL;
}
//销毁链表
LinkList::~LinkList()
{
	delete head;
}
//创建
void LinkList::CreateLinkList(int n)
{
	Node* ptemp;
	ptemp = head;
	while(n<0)
	{
		cout << "输入节点有误,请重新输入:";
		cin >> n;
	}
	if(n==0)
		cout<<"链表为空"<<endl;
	for(int i=0;i<n;i++)
	{
		Node* pnew = new Node;
		cout << "输入第" << i + 1 << "个值:" ;
		cin >> pnew->data;
		ptemp->next = pnew;
		pnew->next = NULL;
		ptemp = pnew;
	}
}
//遍历
void LinkList::TravalLinkList()
{
	Node* ptemp = head;
	if(ptemp==NULL||ptemp->next==NULL)
	{
		cout << "链表为空"<<endl;
	}
	else
	{
		while (ptemp->next != NULL)
		{
			ptemp = ptemp->next;
			cout << ptemp->data << " ";
		}
	}
	cout << endl;
}
//链表长度
int LinkList::GetLength()
{
	int count = 0;
	Node* ptemp = head;
	while(ptemp->next!=NULL)
	{
		ptemp = ptemp->next;
		count++;
	}
	return count;
}
//判断是否为空
bool LinkList::IsEmpty()
{
	if (head->next == NULL)
		return true;
	else
		return false;
}
//查找节点
Node* LinkList::FindNode(Datatype data)
{
	Node* ptemp = head;
	if(ptemp==NULL)
	{
		cout << "链表为空"<<endl;
		return NULL;
	}
	else if(ptemp->data==data)
	{
		return ptemp;
	}
	else while(ptemp->next!=NULL)
	{
		ptemp = ptemp->next;
		if(ptemp->data==data)
		return ptemp;
	}
	return NULL;
}
//在头部插入
void LinkList::InsertNodeAtHead(Datatype data)
{
	Node* pnew = new Node;
	pnew->data = data;
	Node* ptemp = head;
	if(ptemp==NULL)
	{
		ptemp = pnew;
		pnew->next = NULL;
	}
	pnew->next = ptemp->next;
	ptemp->next = pnew;
}
//在尾部插入
void LinkList::InsertNodeAtEnd(Datatype data)
{
	Node* pnew = new Node;
	pnew->data = data;
	pnew->next = NULL;
	Node* ptemp = head;
	if(ptemp==NULL)
		ptemp = pnew;
	else
	{
		while (ptemp->next != NULL)
			ptemp = ptemp->next;
		ptemp->next = pnew;
	}
}
//在指定点插入
void LinkList::InsertNodeAtPoint(Datatype data,int point)
{
	if(point<1||point>GetLength())
	{
		cout << "输入有误,请重新输入:";
		cin >> point;
	}
	Node* pnew = new Node;
	pnew->data = data;
	Node* ptemp = head;
	int i = 1;
	while(point>i)
	{
		ptemp = ptemp->next;
		i++;
	}
	pnew->next = ptemp->next;
	ptemp->next = pnew;
}
//删除头部
void LinkList::DeleteNodeAtHead()
{
	Node* ptemp = head;
	if(ptemp==NULL||ptemp->next==NULL)
		cout << "链表为空,操作失败"<<endl;
	else
	{
		Node* p = NULL;
		ptemp = ptemp->next;
		p = ptemp->next;
		delete ptemp;
		ptemp = NULL;
		head->next = p;
	}
}
//删除尾部
void LinkList::DeleteNodeAtEnd()
{
	Node* ptemp = head;
	if (ptemp == NULL || ptemp->next == NULL)
		cout << "链表为空,操作失败" << endl;
	else
	{
		Node* p = NULL;
		while (ptemp->next != NULL)
		{
			p = ptemp;//记录尾节点前一个节点
			ptemp = ptemp->next;
		}
		delete ptemp;
		ptemp = NULL;
		p->next = NULL;
	}
}
//删除指定数据
void LinkList::DeleteNodeAtPoint(Datatype data)
{
	Node* ptemp = head;
	Node* p = FindNode(data);
	if(p==NULL)
	{
		cout << "数据不存在" << endl;
		return;
	}
	if (p == ptemp->next)
		DeleteNodeAtHead();
	else
	{
		while(ptemp->next!=p)//找到该节点前一个节点
		{
			ptemp = ptemp->next;
		}
		ptemp->next = p->next;
		delete p;
		p = NULL;
	}
}
//全部删除
void LinkList::DeleteAll()
{
	Node* p = head->next;
	if (head == NULL || p == NULL)
		cout << "链表为空,操作失败" << endl;
	else
	{
		while (p != NULL)
		{
			head->next = p->next;
			delete p;
			p = head->next;
		}
	}
	head->next = NULL;
}

int main()
{
	LinkList L;
	int i;
	cout << "1.创建链表;	2.遍历链表;	3.链表长度;	4.判断链表是否为空;" << endl;
	cout << "5.查找数据所在节点;	6.在头部插入数据;	7.在尾部插入数据;" << endl;
	cout << "8.在指定节点插入数据;	9.删除头部;	10.删除尾部;	11.删除指定的数据;	12.删除所有节点;	0.退出" << endl;
	do
	{
		cout << "请输入操作:" ;
		cin >> i;
		switch (i)
		{
		case 1:
			int n;
			cout << "请输入链表长度:";
			cin >> n;
			L.CreateLinkList(n);
			break;
		case 2:
			L.TravalLinkList();break;
		case 3:
			cout <<"链表长度为:"<< L.GetLength() << endl;break;
		case 4:
			if (L.IsEmpty())
				cout << "链表为空" << endl;
			else
				cout << "链表不为空" << endl;
			break;
		case 5:
			Datatype data;
			cout << "输入查找的值:";
			cin >> data;
			cout << "节点的值为" << L.FindNode(data)->data << endl;
			break;
		case 6:
			Datatype headdata;
			cout << "输入在头部插入的数据:";
			cin >> headdata;
			L.InsertNodeAtHead(headdata);
			break;
		case 7:
			Datatype enddata;
			cout << "输入在尾部插入的数据:";
			cin >> enddata;
			L.InsertNodeAtEnd(enddata);
			break;
		case 8:
			Datatype pointdata;
			int point;
			cout << "输入要插入的数据:";
			cin >> pointdata;
			cout << "输入要插入的位置:";
			cin >> point;
			L.InsertNodeAtPoint(pointdata, point);
			break;
		case 9:
			L.DeleteNodeAtHead();break;
		case 10:
			L.DeleteNodeAtEnd(); break;
		case 11:
			Datatype deletedata;
			cout << "输入要删除的数据:";
			cin >> deletedata;
			L.DeleteNodeAtPoint(deletedata);
			break;
		case 12:
			L.DeleteAll();break;
		default:break;
		}
	} while (i != 0);
	return 0;
}

运行界面:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值