单链表也叫做单链线性表
线性表的单链表存储结构
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
实现单链表的插入、删除、归并操作的完整程序(含菜单栏):
创建单链表时有顺序和逆序两种创建的方法(本程序使用的是顺序的创建方法)
逆序的创建方法头指针不后移
//单链表插入
#include<stdio.h>
#include<iostream>
#define OVERFLOW -2
#define ERROR 0
#define OK 1
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
LinkList L,la,lb,lc;
int CreateList(LinkList &L,int n)
{
//顺序输入n个元素的值,建立带头结点的单链线性表L
int i;
LinkList s,p;
L=(LinkList)malloc(sizeof(LNode));
if(!L)
exit(OVERFLOW);
L->next=NULL;
p=L;
for(i=1;i<=n;i++)
{
s=(LinkList)malloc(sizeof(LNode));
if(!s)
exit(OVERFLOW);
cin>>s->data;
p->next=s;
s->next=NULL;
p=p->next;
}
}
int ListInsert(LinkList &L,int i,int e)
{
//在带头结点的单链线性表中第i个位置之前插入元素e
int j=1;
LinkList p,s,t;
t=p=L;
while(p&&j<i)
{p=p->next;j++;}
if(!p||j>i)
return ERROR;
s=(LinkList)malloc(sizeof(LNode));
if(!s)
exit(OVERFLOW);
s->data=e;
s->next=p->next;
p->next=s;
cout<<"执行插入操作后的单链线性表的序列为:"<<endl;
for(t=t->next;t;t=t->next)
cout<<t->data<<" ";
return OK;
}
int ListDelete(LinkList &L,int i,int &e)
{
//在带头结点的单链线性表中,删除第i个元素,并用e返回其值
LinkList p,q,t;
int j=1;
t=p=L;
while(p->next&&j<i)
{p=p->next;j++;}
if(!p->next||j>i)
return ERROR;
q=p->next;
e=q->data;
p->next=p->next->next;
free(q);
cout<<"执行删除操作后的单链线性表的序列为:"<<endl;
for(t=t->next;t;t=t->next)
cout<<t->data<<" ";
return e;
}
void MergeList(LinkList la,LinkList lb,LinkList &lc)
{
LinkList pa,pb,pc,t;
pa=la->next;
pb=lb->next;
lc=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;
free(lb);
cout<<"归并后的单链线性表的序列为:"<<endl;
for(t=lc->next;t;t=t->next)
cout<<t->data<<" ";
}
int main()
{
int n,i,t,e,time=1,na,nb;
while(time)
{
cout<<"请输入想要执行的命令的序号:"<<endl;
cout<<"0、退出程序"<<endl;
cout<<"1、单链线性表插入操作"<<endl;
cout<<"2、单链线性表删除操作"<<endl;
cout<<"3、实现两个单链线性表的归并:"<<endl;
cin>>t;
switch(t)
{
case 3:
cout<<"请输入单链线性表la的元素个数:"<<endl;
cin>>na;
cout<<"请依次输入单链线性表la的元素:"<<endl;
CreateList(la,na);
cout<<"请输入单链线性表lb的元素个数:"<<endl;
cin>>nb;
cout<<"请依次输入单链线性表lb的元素:"<<endl;
CreateList(lb,nb);
MergeList(la,lb,lc);
cout<<endl;
break;
case 2:
cout<<"请输入单链线性表的元素个数:"<<endl;
cin>>n;
cout<<"请依次输入单链线性表的元素:"<<endl;
CreateList(L,n);
cout<<"请输入想要删除第几个元素:"<<endl;
cin>>i;
ListDelete(L,i,e);
cout<<endl;
cout<<"删除的元素为:"<<endl;
cout<<e<<endl;
break;
case 1:
cout<<"请输入单链线性表的元素个数:"<<endl;
cin>>n;
cout<<"请依次输入单链线性表的元素:"<<endl;
CreateList(L,n);
cout<<"请输入想要插入的元素:"<<endl;
cin>>e;
cout<<"请输入想要插入元素的位置(几号元素之前):"<<endl;
cin>>i;
ListInsert(L,i,e);
cout<<endl;
break;
case 0:
time=0;
break;
}
}
}
运行结果: