单链表及其基本操作验证程序设计

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

编程完成单链表的建立、遍历、插入、删除、查找、排序、合并、归并等算法功能及实现。

代码

#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);
}

测试结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值