一、本周学习内容:
对线性表的顺序存储结构和链式存储结构进行了算法实现,并对其区别进行分析比较。
顺序存储:
#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;
}
运行界面: