编程完成单链表的建立、遍历、插入、删除、查找、排序、合并、归并等算法功能及实现。
代码
#include<iostream>
#include<string.h>
#include<ctype.h>
#include<malloc.h>
#include<limits.h>
#include<stdio.h>
#include<stdlib.h>
#include<io.h>
#include<process.h>
using namespace std;
#define TURE 1
#define FLASE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int Status;
typedef int Boolean;
typedef int Elemtype;
struct LNode //链表结构
{
Elemtype data;
Elemtype len;
LNode *next;
};
typedef struct LNode *LinkList;
Status GetElem(LinkList L,int n,Elemtype &e) //获取表中n位置元素并用e返回
{
LinkList p=L;
if (n<=0||n>L->len) return ERROR;
for(int i=1;i<=n;i++) p=p->next;
e=p->data;
return OK;
}
int LocateElem(LinkList L,Elemtype e)
{
LinkList p=L->next;
int i=1;
while(p) {if(p->data==e) return i; p=p->next;i++;}
return 0;
}
Status CreatLink1(LinkList &L,int n) //正序创建链表
{
L=(LinkList)malloc(sizeof(LNode));
if(!L) exit(OVERFLOW);
L->next=NULL;
L->len=0;
LinkList p,q;
p=L;
for(int i=1;i<=n;i++)
{
q=(LinkList)malloc(sizeof(LNode));
cin>>q->data;
p->next=q;
p=p->next;
L->len++;
}
p->next=NULL;
return OK;
}
Status CreatLink2(LinkList &L,int n) //逆序创建链表
{
L=(LinkList)malloc(sizeof(LNode));
if(!L) exit(OVERFLOW);
L->len=0;
L->next=NULL;
LinkList p,q;
for(int i=1;i<=n;i++)
{
q=(LinkList)malloc(sizeof(LNode));
cin>>q->data;
p=L->next;
q->next=p;
L->next=q;
L->len++;
}
return OK;
}
Status ListTraverse(LinkList L) //遍历表
{
LinkList p=L->next;
while(p) {cout<<p->data<<" ";p=p->next;}
return OK;
}
Status InsertList(LinkList L,int n,Elemtype e) //在链表中第n位置前插入元素e
{
if(n<=0||n>L->len+1) return ERROR;
LinkList p,q;
p=L;
for(int i=1;i<n;i++) p=p->next;
q=(LinkList)malloc(sizeof(LNode));
q->data=e;
q->next=p->next;
p->next=q;
L->len++;
return OK;
}
void sort(LinkList &L) //按非递减排序
{
int n=L->len,f;
Elemtype t;
LinkList p;
for(int i=n;i>1;i--)
{
p=L->next;f=1;
for(int j=1;j<n;j++)
{
if(p->data>p->next->data) {t=p->data; p->data=p->next->data; p->next->data=t;f=0;}
p=p->next;
}
if(f) break;
}
}
Status DeleteList(LinkList &L,int n) //删除链表第n位置元素
{
if(n<=0||n>L->len) return ERROR;
LinkList p,q;
p=L;
for(int i=1;i<n;i++) p=p->next;
q=p->next;
p->next=q->next;
delete q;
return OK;
}
void MergeList(LinkList La,LinkList Lb) //将表Lb归并到表La(非递减归并)
{
sort(La); sort(Lb);
LinkList pc,pa=La->next,pb=Lb->next;
pc=La;
while(pa&&pb)
{
if(pa->data<=pb->data) {pc->next=pa; pc=pa;pa=pa->next;}
else {pc->next=pb; pc=pb;pb=pb->next;}
}
pc->next=pa?pa:pb;
La->len+=Lb->len;
}
int num(char str[])
{
int n=0,i,l;
l=strlen(str);
if(str[0]=='-')
{for(i=1;i<l;i++) n+=int(str[i]-48)*int(pow(10.,l-i-1));
return -n;}
else
{for(i=0;i<l;i++) n+=int(str[i]-48)*int(pow(10.,l-i-1));
return n;}
}
int input(int &n) //判断输入的合理性
{
char str[100];
cin>>str;
if(str[0]!=45&&(str[0]>'9'||str[0]<'0')) return 0;
for(int i=1;i<strlen(str);i++) if(str[i]>'9'||str[i]<'0') {return 0;break;}
n=num(str);
return 1;
}
int input(char &s)
{
char str[100];
cin>>str;
if (strlen(str)!=1) return 0;
else if(str[0]!='a'&&str[0]!='B'&&str[0]!='A'&&str[0]!='b') return 0;
else { s=str[0];return 1;}
}
int main()
{
LinkList La,Lb,p;
int i,n,l,len_a,len_b,e; char s;
cout<<"//建立链表La..."<<'\n'<<"请输入La的长度:";
while(!input(len_a)||len_a<0) { cout<<"输入错误!!!"<<'\n'<<"请重新输入:";}
cout<<"请(正序)输入"<<len_a<<"个数据给La:"; CreatLink1(La,len_a);
cout<<endl;
cout<<"//建立链表Lb..."<<'\n'<<"请输入Lb的长度:";
while(!input(len_b)||len_b<0) { cout<<"输入错误!!!"<<'\n'<<"请重新输入:";}
cout<<"请(逆序)输入"<<len_b<<"个数据给Lb:"; CreatLink2(Lb,len_b);
cout<<endl;
cout<<'\n'<<"链表La的数据是:";ListTraverse(La) ;
cout<<'\n'<<"链表Lb的数据是:";ListTraverse(Lb) ;
do
{
cout<<'\n'<<"///////////////////////////////////////////////////////////////////////////////////////////////////////////////////"
<<'\n'<<endl;
cout<<"链表操作:"<<'\n'<<" 1.插入数据"<<'\t'<<'\t'<<"2.删除数据"
<<'\t'<<'\t'<<"3.查找数据"<<'\t'<<'\t'<<"4.输出链表"<<'\n'
<<" 5.非递减排序"<<'\t'<<'\t'<<"6.归并链表La和Lb(非递减排序)"
<<'\t'<<'\t'<<"0.退出"<<'\n'<<'\n'<<"请输入操作序号:";
while(!input(n)||n<0||n>6)
{cout<<"****输入错误****"<<'\n'<<'\n'<<"请输入操作序号:";}
switch(n)
{
case 1:
cout<<"选择操作对象(A:La B:Lb):";
while(!input(s))
{cout<<"****输入错误****"<<'\n'<<'\n'<<"选择操作对象(A:La B:Lb):";}
switch(s)
{
case 'A':
case 'a':
{
cout<<"请输入插入位置:";
while(!input(l)||l<1||l>La->len+1)
{cout<<"****输入错误****"<<'\n'<<'\n'<<"请输入插入位置:";}
cout<<"输入数据:";
while(!input(e))
{cout<<"****输入错误****"<<'\n'<<'\n'<<"请重新输入数据:";}
InsertList(La,l,e);
cout<<'\n'<<"链表La的数据是:";ListTraverse(La);cout<<endl;
}break;
case 'B':
case 'b':
{
cout<<"请输入插入位置:";
while(!input(l)||l<1||l>Lb->len+1)
{cout<<"****输入错误****"<<'\n'<<'\n'<<"请输入插入位置:";}
cout<<"输入数据:";
while(!input(e))
{cout<<"****输入错误****"<<'\n'<<'\n'<<"请重新输入数据:";}
InsertList(Lb,l,e);
cout<<'\n'<<"链表Lb的数据是:";ListTraverse(Lb);cout<<endl;
}break;
}
break;
case 2:
cout<<"选择操作对象(A:La B:Lb):";
while(!input(s))
{cout<<"****输入错误****"<<'\n'<<'\n'<<"选择操作对象(A:La B:Lb):";}
switch(s)
{
case 'A':
case 'a':
{
cout<<"请输入删除位置:";
while(!input(l)||l<1||l>La->len)
{cout<<"****输入错误****"<<'\n'<<'\n'<<"请输入删除位置:";}
DeleteList(La,l);
cout<<'\n'<<"链表La的数据是:";ListTraverse(La);cout<<endl;
}break;
case 'B':
case 'b':
{
cout<<"请输入删除位置:";
while(!input(l)||l<1||l>Lb->len)
{cout<<"****输入错误****"<<'\n'<<'\n'<<"请输入删除位置:";}
DeleteList(Lb,l);
cout<<'\n'<<"链表Lb的数据是:";ListTraverse(Lb);cout<<endl;
}break;
}
break;
case 3:
cout<<"输入查找数据: "; int data;
while(!input(data))
{cout<<"****输入错误****"<<'\n'<<'\n'<<"输入查找数据:";}
if (LocateElem(La,data)>0||LocateElem(Lb,data)>0)
{
if (LocateElem(La,data)>0)
{p=La->next;
cout<<"链表La中";
for(i=1;p;i++,p=p->next) {if(data==p->data) cout<<"("<<i<<")";}
cout<<"位置存在数据"<<data<<endl;
}
if (LocateElem(Lb,data)>0)
{p=Lb->next;
cout<<"链表Lb中";
for(i=1;p;i++,p=p->next) {if(data==p->data) cout<<"("<<i<<")";}
cout<<"位置存在数据"<<data<<endl;
}
}
else cout<<"不存在此数据...."<<endl;
break;
case 4:;
cout<<'\n'<<"链表La的数据是:";ListTraverse(La);cout<<endl;
cout<<"链表Lb的数据是:";ListTraverse(Lb);cout<<endl;
break;
case 5:
cout<<"选择操作对象(A:La B:Lb):";
while(!input(s)){cout<<"****输入错误****"<<'\n'<<'\n'<<"选择操作对象(A:La B:Lb):";}
switch(s)
{
case 'A':
case 'a':
sort(La);
cout<<'\n'<<"链表La的数据是:";
ListTraverse(La);cout<<endl;
break;
case 'B':
case 'b':
sort(Lb);
cout<<'\n'<<"链表Lb的数据是:";
ListTraverse(Lb);cout<<endl;
}
break;
case 6:
MergeList(La,Lb);
cout<<'\n'<<"链表La的数据是:";
ListTraverse(La);cout<<endl;
break;
}
}while(n>0);
}
测试结果






本文详细介绍了使用C++实现单链表的各种基本操作,包括创建、遍历、插入、删除、查找、排序和归并等功能。通过具体代码展示了正序和逆序创建链表的方法,以及如何进行链表的遍历、元素的插入和删除、数据查找、非递减排序和链表归并。文章还提供了完整的测试结果,验证了算法的正确性和有效性。
1265

被折叠的 条评论
为什么被折叠?



