随机产生两组两位整数,建立两个带有头结点的循环单链表,并设尾指针为RL1和RL2,将第二个链表插入到第一个链表的第i个结点前。
函数为: ① void createList(LinkList&rear)
② void insertList(LinkList &CR1, LinkList &CR2, int i)
分析:首先建立循环链表,将尾指针最后指向头指针就OK了,然后就是执行插入操作。首先,要将第二条链断开,如果设置尾指针会比较容易操作,若没有尾指针就直接遍历,将头节点的数据域设为1。然后找到第一个链表的第i个结点,连接两个链表。
代码实现:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<ctime>
using namespace std;
const int maxn=100;
typedef struct node{
int data;
struct node *next;
}*LinkList;
int n,m;
int map_a[maxn],map_b[maxn];
void init(int n,int a[])
{
int i,j,k,x;
srand (time(0));
for(i=0;i<n;i++)
{
q: int x=rand()%89+10;
for(j=0;j<i;j++)
{
if(x==a[j])
goto q;
}
a[i]=x;
}
}
void createList(LinkList &rear,int a[])
{
int i=0;
struct node *p,*q;
q=rear;
while(a[i])
{
p=(node *)malloc(sizeof(node));
p->data=a[i];
q->next=p;
q=p;
i++;
}
q->next=rear;
}
void output(LinkList head)
{
LinkList p;
p=head->next;
while(p->data!=-1)
{
printf("%d\t",p->data);
p=p->next;
}
printf("\n\n");
}
void insertList(LinkList &CR1, LinkList &CR2, int i)
{
if(i<0||i>n)
return ;
LinkList p,q,s;
s=(LinkList)malloc(sizeof(LinkList));
p=CR2->next;
while(p->next->data!=-1)
p=p->next;
p->next=NULL; //断开第一个链表
q=CR1; //找到第二个链表的断开的结点
while(i)
{
q=q->next;
i--;
}
p=CR2->next; //从第二个链表的第一个结点开始连接
s=q->next; //记录下一个需要的连接点
q->next=p; //断开连接p
while(p->next)
{
p=p->next;
}
p->next=s;
}
int main()
{
int i,j,k;
LinkList RL1,RL2;
RL1=(node *)malloc(sizeof(node));
RL2=(node *)malloc(sizeof(node));
RL1->data=-1;
RL2->data=-1;
puts("输入产生随机数的个数:");
scanf("%d%d",&n,&m);
puts("创建循环链表:");
init(n,map_a);
init(m,map_b);
createList(RL1,map_a);
createList(RL2,map_b);
puts("输出链表:");
output(RL1);
output(RL2);
puts("输入要插入的结点位置:");
scanf("%d",&i);
insertList(RL1,RL2,i);
output(RL1);
return 0;
}