链表的建立,插入,删除,即有序合并:
结构体的定义
#include<iostream>
//#include<cstdlib>
#define OK 0//0代表正常退出
#define ERROR -1 //-1代表发生了错误。
using namespace std;
typedef struct LNode{
int date;
struct LNode *next;
}LNode,*LinkList;
头插法建立链表
思路
void CreatList(LinkList &L ){//建立链表,插入到链表的头部,也就是常说的头插法
printf("请输入你创建链表的大小:");
int N;
scanf("%d",&N);
L=(LinkList)malloc(sizeof(LNode));//调用Malloc函数为头节点分配内存
L->next=NULL;//建立一个带头结点的单链表
for(int i=N; i>0; --i){
LinkList p=(LinkList)malloc(sizeof(LNode));
int temp;//用于接收数据
printf("请输入数据:");
scanf("%d",&temp);
p->date=temp;
p->next=L->next;
L->next=p;
}
}
尾插法建立链表
思路
void CreatList(LinkList &L,string name)//建立链表,name为链表的名字方便区分,以下雷同。
{
cout<<"请输入你创建"<<name<<"链表的大小:";
int N;
cin>>N;
LinkList p,q;
L=p=(LinkList)malloc(sizeof(LNode));//调用Malloc函数为头节点分配内存
p->next=NULL;//建立一个带头结点的单链表
for(int i=0; i<N; i++)//尾插法
{
q=(LinkList)malloc(sizeof(LNode));
int temp;//用于接收数据
cout<<"请输入数据:";
cin>>q->date;
p->next=q;
p=q;
}
p->next=NULL;//q->next=NULL;也是可以的
}
以下代码比较简单
int ListInsert(LinkList &L,string name)
{
cout<<"当前被操作的时链表:"<<name<<endl;
cout<<"请输入你要插入元素的位置:";
int i;
cin>>i;
cout<<"请输入你要插入元素位置的值:";
int E;
cin>>E;
LinkList p=L;
int j=0;
while(p&&j<i-1)//寻找第i-1个节点
{
p=p->next;
++j;
}
if(!p || j>i-1)//i<1或大于表长+1:
{
cout<<"插入位置无效!"<<endl;
return ERROR;
}
LinkList s=(LinkList)malloc(sizeof(LNode));
s->date=E;
s->next=p->next;
p->next=s;
return 0;
}
int DeleteList(LinkList &L,string name)
{
cout<<"当前被操作的时链表:"<<name<<endl;
cout<<"请输入你要删除元素的位置:";
int i;
cin>>i;
LinkList p=L;
int j=0;
while(p->next&&j<i-1)
{
p=p->next;
++j;
}
if(!(p->next) || j>i-1)
{
cout<<"删除位置无效!"<<endl;
return ERROR;
}
LinkList q=p->next;
p->next=q->next;
free(q);
return 0;
}
int 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)
{
cout<<"访问失败";
return ERROR;
}
E=p->date;
return 0;
}
void MergeList(LinkList &L1,LinkList &L2,LinkList &L3)
{
LinkList p1=L1->next;
LinkList p2=L2->next;
LinkList p3=L3;
while(p1&&p2)
{
if(p1->date<=p2->date)
{
p3->next=p1;
p3=p1;
p1=p1->next;
}
else
{
p3->next=p2;
p3=p2;
p2=p2->next;
}
}
p3->next=p1?p1:p2;
free(L2);
cout<<"合并成功!";
}
int PrintList(LinkList L,string name)
{
LinkList p=L;
cout<<"链表"<<name<<"中的元素为:";
while(p->next)
{
p=p->next;
cout<<p->date<<" ";
}
cout<<endl;
return 0;
}
int main()
{
LinkList head1,head2,head3;
CreatList(head1,"head1");
PrintList(head1,"head1");
ListInsert(head1,"head1");
PrintList(head1,"head1");
CreatList(head2,"head2");
PrintList(head2,"head2");
DeleteList(head2,"head2");
PrintList(head2,"head2");
CreatList(head3,"head3");
PrintList(head3,"head3");
MergeList(head1,head2,head3);
PrintList(head3,"head3");
return 0;
}