深入理解链表表的逻辑结构,物理结构等概念,掌握链表的基本操作的编程实现,掌握C语言中指针的操作
头文件:
源文件:
//main函数
#include <iostream>
#include"LNode.h"
using namespace std;
int main()
{
cout<<"如果想要开始程序,请输入“Y”"<<endl;
char i;
cin>>i;
if(i=='Y'){
Print();
LinkList L;
LinkList p;
Menu(L);
//cout<<"HelloWorld!"<<endl;
}
return 0;
}
//头文件
#ifndef LNODE_H_INCLUDED
#define LNODE_H_INCLUDED
#include<iostream>
using namespace std;
typedef int Status;
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//初始化单链表
Status InitList(LinkList &L);
//销毁单链表
Status DestroyList(LinkList &L);
//清空单链表
Status ClearList(LinkList L);
//求单链表的长度
Status ListLength(LinkList L);
//判断单链表是否为空
bool ListEmpty(LinkList L);
//单链表的按位置查找
Status LinkList_id(LinkList L,int num);
//单链表的按值查找
Status LocateElem_L(LinkList L,ElemType e);
//求第i个元素的直接前驱
Status PriorElem(LinkList L,int i);
//求第i个元素的直接后继
Status NextElem(LinkList L,int i);
//在单链表的第i个位置插入一个元素
Status LinkListInsert(LinkList L,int i,ElemType e);
//将单链表中第i个数据元素删除
Status ListLinkDelete(LinkList L,int i/*,ElemType &e*/);
//创建单链表
void CreatList_R(LinkList &L,LinkList p,int n);
//遍历输出单链表
void PrintList(LinkList L);
//显示选择功能
void Print();
//选择功能
Status Menu(LinkList L);
#endif // LNODE_H_INCLUDED
//源文件
#include<iostream>
#include"LNode.h"
#define OK 1
#define OVERFLOW -2
#define ERROR 0
using namespace std;
//初始化单链表
Status InitList(LinkList &L){
L=new LNode;
if(!L)exit(OVERFLOW);
L->next=NULL;
return OK;
}
//销毁单链表
Status DestroyList(LinkList &L){
LinkList p;
while(L){
p=L;
L=L->next;
delete p;
}
return OK;
}
//创建单链表——后插法
void CreatList_R(LinkList &L,LinkList p,int n){
L=new LNode;
L->next=NULL;
LinkList r;
r=L;
for(int i=0;i<n;i++){
p=new LNode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
}
//清空单链表
Status ClearList(LinkList L){
LinkList p,q;
p=L->next;
while(p){
q=p->next;
delete p;
p=q;
}
L->next=NULL;
return 0;
}
//求单链表的长度
Status ListLength(LinkList L){
LinkList p=L->next;
int acount=0;
while(p){
++acount;
p=p->next;
}
return acount;
}
//判断单链表是否为空
bool ListEmpty(LinkList L){
return L->next!=NULL;
}
//单链表的按位置查找
Status LinkList_id(LinkList L,int num){
int len=ListLength(L);
if(num<1||num>len){
cout<<"查找位置不合法!"<<endl;
}
LinkList p=L->next;
for(int i=1;i<num;i++){
p=p->next;
}
int res=p->data;
return res;
}
//求前驱
Status PriorElem(LinkList L,int num){
int len=ListLength(L);
if(num-1<1||num>len){
cout<<"查找位置不合法!"<<endl;
}
LinkList p=L;
for(int i=1;i<num;i++){
p=p->next;
}
int res=p->data;
return res;
}
//求后继
Status NextElem(LinkList L,int num){
int len=ListLength(L);
if(num+1<1||num>len){
cout<<"查找位置不合法!"<<endl;
}
LinkList p=L->next->next;
for(int i=1;i<num;i++){
p=p->next;
}
int res=p->data;
return res;
}
//单链表的按值查找
Status LocateElem_L(LinkList L,ElemType e){
LNode *p=L;
int len=0;
while(p&&(p->data!=e))
{
p=p->next;
len++;
}
if(len<=ListLength(L))
return p->data;
else
return ListLength(L)+1;
}
//在单链表的第i个位置插入一个元素
Status LinkListInsert(LinkList L,int i,ElemType e){
LinkList p=L;int j=0;LNode* s;
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个数据元素删除
Status ListLinkDelete(LinkList L,int i/*,ElemType &e*/){
LinkList p=L;int j=0;LNode* r;
while(p->next&&j<i-1){
p=p->next;
++j;
}
if(!(p->next)||j>i-1)return ERROR;
r=p->next;
p->next=r->next;
//e=r->data;
delete r;
return OK;
}
//遍历输出单链表
void PrintList(LinkList L){
LinkList p=L->next;
if(ListLength(L)>0){
cout<<"当前单链表的所有元素为:"<<endl;
while(p){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
else cout<<"当前单链表已为空!"<<endl;
}
//显示选择功能
void Print(){
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<<"#-------------------8 -------在单链表中查找值为e的元素:-------#"<<endl;
cout<<"#-------------------9 -------求前驱:------------------------- #"<<endl;
cout<<"#-------------------10 ------求后继---------------------------#"<<endl;
cout<<"#-------------------11-------在单链表的指定位置插入元素-------#"<<endl;
cout<<"#-------------------12-------删除单链表指定位置的元素:--------#"<<endl;
cout<<"#-------------------13-------输出当前单链表:------------------#"<<endl;
cout<<"请选择要执行的功能:"<<endl;
}
//选择功能
Status Menu(LinkList L){
int num;
cin>>num;
int count=0;
while(num)
{
switch(num)
{
case 0:
num=0;
break;
case 1:
InitList(L);
count++;
cout<<"单链表初始化完成!"<<endl;
break;
case 2:
if(count==0){
cout<<"请初始化一个单链表"<<endl;
break;
}
int n;
cout<<"请输入插入个数:";
cin>>n;
LinkList p;
cout<<"请插表:";
CreatList_R(L,p,n);
cout<<"单链表创建完成!"<<endl;
break;
case 3:
if(count==0){
cout<<"请初始化一个单链表"<<endl;
break;
}
DestroyList(L);
count--;
cout<<"单链表已销毁!"<<endl;
break;
case 4:
if(count==0){
cout<<"请初始化一个单链表"<<endl;
break;
}
ClearList(L);
cout<<"单链表已清空!"<<endl;
break;
case 5:
if(count==0){
cout<<"请初始化一个单链表"<<endl;
break;
}
else if(ListEmpty(L))
cout<<"单链表不为空!"<<endl;
else
cout<<"单链表为空!"<<endl;
break;
case 6:
if(count==0){
cout<<"请初始化一个单链表"<<endl;
break;
}
cout<<"单链表的长度为:"<<ListLength(L)<<endl;
break;
case 7:
if(count==0){
cout<<"请初始化一个单链表"<<endl;
break;
}
cout<<"请输入要查找的元素的位置:";
int num;
cin>>num;
if(num<1||num>ListLength(L)){cout<<"查找位置不合法"<<endl;break;}
else
cout<<"第"<<num<<"位的元素为"<<LinkList_id(L,num)<<endl;
break;
case 8:
if(count==0){
cout<<"请初始化一个单链表"<<endl;
break;
}
cout<<"请输入要查找的元素:";
int index;
cin>>index;
if(LocateElem_L(L,index)>ListLength(L)){
cout<<"该元素在单链表中不存在!"<<endl;
}else
cout<<"元素"<<index<<"在单链表中存在,取值为:"<<LocateElem_L(L,index)<<endl;
break;
case 9:
if(count==0){
cout<<"请初始化一个单链表"<<endl;
break;
}
cout<<"请输入要查找的元素的序号:";
int x;
cin>>x;
if(x<=1||x>ListLength(L)){cout<<"查找位置不合法"<<endl;break;}else
cout<<x<<"号元素"<<"的直接前驱为:"<<PriorElem(L,x)<<endl;
break;
case 10:
if(count==0){
cout<<"请初始化一个单链表"<<endl;
break;
}
cout<<"请输入要查找的元素的序号:";
int s;
cin>>s;
if(s<1||s>=ListLength(L)){cout<<"查找位置不合法"<<endl;break;}else
cout<<s<<"号元素"<<"的直接后继为:"<<NextElem(L,s)<<endl;
break;
case 11:
if(count==0){
cout<<"请初始化一个单链表"<<endl;
break;
}
cout<<"请输入要插入的位置以及要插入的元素(以空格分)"<<endl;
int a,b;
cin>>a;cin>>b;
if(a<1||a>ListLength(L)){cout<<"插入位置不合法"<<endl;break;}
else if( LinkListInsert(L,a,b)==OK)
cout<<"已完成指定位置元素的插入"<<endl;
break;
case 12:
if(count==0){
cout<<"请初始化一个单链表"<<endl;
break;
}
cout<<"请输入要删除的位置的元素"<<endl;
int m;
cin>>m;
if(m<1||m>ListLength(L)){cout<<"删除位置不合法"<<endl;break;}
ListLinkDelete(L,m);
cout<<"已完成指定位置元素的删除"<<endl;
break;
case 13:
if(count==0){
cout<<"请初始化一个单链表"<<endl;
break;
}
PrintList(L);break;
}
cout<<"请再次选择功能:"<<endl;
cin>>num;
}
}