依据严蔚敏数据结构教材编写。
编写了以下功能:初始化、头插法创建表、尾插法创建表、输出链表、按位置查找、按值查找返回地址、按值查找返回位置、插入、删除、判断链表是否为空、求表长、清空链表、销毁链表。
完整代码如下:
#include <iostream>
using namespace std;
typedef struct LNode{ //定义单链表存储结构
int data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;
bool InitList(LinkList &L){ //初始化
L = new LNode;
L->next = NULL;
return true;
}
void CreateList_H(LinkList &L, int n){ //头插法创建链表
L = new LNode;
L->next = NULL;
LinkList p;
for (int i = 0; i < n; ++i) {
p = new LNode;
cin>>p->data;
p->next = L->next;
L->next = p;
}
cout<<"创建成功"<<endl;
}
void CreateList_T(LinkList &L, int n){ //尾插法创建链表
L = new LNode;
L->next = NULL;
LinkList p;
LinkList r = L;
for (int i = 0; i < n; ++i) {
p = new LNode;
cin>>p->data;
p->next = NULL;
r->next = p;
r = p;
}
cout<<"创建成功"<<endl;
}
void ShowList(LinkList L){ //输出链表
LinkList p = L->next;
while (p){
cout<<p->data<<" ";
p = p->next;
}
cout<<endl;
}
bool GetElem(LinkList L,int i, int &e){ //按位置查找
LinkList p = L->next;
int j=1;
while (p && j<i){
p = p->next;
j++;
}
if (!p || j>i) return false;
e = p->data;
return true;
}
LNode *LocateElem_A(LinkList L, int e){ //按值查找,返回地址
LinkList p = L->next;
while (p && p->data != e){
p = p->next;
}
return p;
}
int LocateElem_L(LinkList L, int e){ //按值查找,返回位置
LinkList p = L->next;
int j = 1;
while (p && p->data != e){
p = p->next;
j++;
}
if (p) return j;
else return 0;
}
bool ListInsert(LinkList &L, int i, int e){ //插入
LinkList p = L;
int j = 0;
while (p && j < i-1){
p = p->next;
j++;
}
if(!p || j > i-1) return false;
LinkList s = new LNode;
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
bool ListDelete(LinkList &L, int i){ //删除
LinkList p = L;
int j = 0;
while (p->next && j < i-1){
p = p->next;
j++;
}
if (!(p->next) || j > i-1) return false;
LinkList q = p->next;
p->next = q->next;
delete q;
return true;
}
bool ListEmpty(LinkList L){ //判断是否为空
return L->next ? true : false;
}
int ListLength(LinkList L){ //求表长
LinkList p = L->next;
int i = 0;
while (p){
i++;
p = p->next;
}
return i;
}
bool ClearList(LinkList &L){ //清空链表
LinkList p,q;
p = L->next;
while (p){
q = p->next;
delete p;
p =q;
}
L->next = NULL;
return true;
}
bool DestoryList(LinkList &L){ //销毁链表
LinkList p;
while (L){
p = L;
L = L->next;
delete p;
}
return true;
}
int main() {
LinkList L;
int i,e,n;
cout<<"1.初始化------------------------8.插入"<<endl;
cout<<"2.头插法创建表------------------9.删除"<<endl;
cout<<"3.尾插法创建表------------------10.判断链表是否为空"<<endl;
cout<<"4.输出链表----------------------11.求表长"<<endl;
cout<<"5.按位置查找--------------------12.清空链表"<<endl;
cout<<"6.按值查找返回地址--------------13.销毁链表"<<endl;
cout<<"7.按值查找返回位置--------------0.退出"<<endl;
int choose = -1;
while (choose != 0){
cout<<"请选择功能:";
cin>>choose;
switch (choose){
case 1: //初始化
cout<<"链表初始化中..."<<endl;
if(InitList(L))
cout<<"初始化成功!"<<endl;
else
cout<<"初始化失败"<<endl;
break;
case 2: //头插法
cout<<"请输入插入元素个数:";
cin>>n;
cout<<"请输入插入的元素(倒序):"<<endl;
CreateList_H(L,n);
break;
case 3: //尾插法
cout<<"请输入插入元素个数:";
cin>>n;
cout<<"请输入插入的元素(正序):"<<endl;
CreateList_T(L,n);
break;
case 4: //输出
cout<<"链表中元素为:";
ShowList(L);
break;
case 5: //按位置查找
cout<<"请输入要查找的位置:";
cin>>i;
if(GetElem(L,i,e)) cout<<"第"<<i<<"个元素是"<<e<<endl;
else cout<<"查找失败"<<endl;
break;
case 6: //按值查找,返回地址
cout<<"请输入要查找的元素:";
cin>>e;
if((LocateElem_A(L,e)) != 0)
cout<<"该元素的地址为:"<<LocateElem_A(L,e)<<endl;
else cout<<"链表中没有该元素"<<endl;
break;
case 7: //按值查找,返回位置
cout<<"请输入要查找的元素:";
cin>>e;
if((LocateElem_L(L,e)) != 0)
cout<<"该元素位于第"<<LocateElem_L(L,e)<<"个"<<endl;
else cout<<"链表中没有该元素"<<endl;
break;
case 8: //插入
cout<<"请输入要插入的元素e及其插入位置i:";
cin>>e>>i;
if (ListInsert(L,i,e)) cout<<"插入成功"<<endl;
else cout<<"插入失败"<<endl;
break;
case 9: //删除
cout<<"请输入要删除元素的位置:";
cin>>i;
if (ListDelete(L,i)) cout<<"删除成功"<<endl;
else cout<<"删除失败"<<endl;
break;
case 10: //是否为空
if (ListEmpty(L)) cout<<"链表不为空"<<endl;
else cout<<"链表为空"<<endl;
break;
case 11: //求表长
cout<<"表长为:"<<ListLength(L)<<endl;
break;
case 12: //清空
cout << (ClearList(L) ? "清除成功" : "清除失败") << endl;
break;
case 13:
cout << (DestoryList(L) ? "销毁成功" : "销毁失败") << endl;
break;
}
}
return 0;
}
运行结果展示: