参考题目:2019软专算法题T1(链表模板)_UncleJokerly的博客-CSDN博客
代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *left;
struct node *right;
}Node,*LinkList;
void InitList(LinkList &L)//初始化双向循环链表
{
L=(Node*)malloc(sizeof(Node));
L->left=L;
L->right=L;
}
//void TailInsertList(LinkList &L)//双向循环链表尾插
//{
// Node *p=L;
// int a[7]={1,2,3,4,5,6,7};
// for(int i=0;i<7;i++)
// {
// Node *q=(Node*)malloc(sizeof(Node));
// q->data=a[i];
//
// q->right=p->right;
// q->left=p;
// p->right=q;
// //p->left=q;不要加
// p=q;
// }
// L->left=p;
//}
void TailInsertList(LinkList &L,int a[],int len)//双向循环链表尾插
{
Node *p=L;
for(int i=0;i<len;i++)
{
Node *q=(Node*)malloc(sizeof(Node));
q->data=a[i];
q->right=p->right;
q->left=p;
p->right=q;
//p->left=q;不要加
p=q;
}
L->left=p;
}
void HeadInsertList(LinkList &L,int a[],int len)//双向循环链表头插
{
Node *p;
for(int i=0;i<len;i++)
{
Node *q=(Node*)malloc(sizeof(Node));
q->data=a[i];
q->right=L->right;
q->left=L;
L->right=q;
if(i==0)
{
p=q;
}
}
L->left=p;
}
void PrintList(LinkList L)//遍历输出双向循环链表
{
printf("双向循环链表的序列为:\n");
Node *p=L->right;
while(p!=L)
{
printf("%d ",p->data);
p=p->right;
}
printf("\n");
}
void zhaiList(LinkList L,LinkList &L1,LinkList &L2)//把L中的奇数摘出来保存到L1,把L中的偶数摘出来保存到L2
{
int index=1;
Node *p=L->right;
int a[100],b[100];
int cnt1=0,cnt2=0;
while(p!=L)
{
Node *q=(Node*)malloc(sizeof(Node));
if(index%2==1)//是奇数,建立a数组
{
a[cnt1++]=p->data;
}
else if(index%2==0)//是偶数,建立b数组
{
b[cnt2++]=p->data;
}
index++;
p=p->right;
}
TailInsertList(L1,a,cnt1);
HeadInsertList(L2,b,cnt2);
}
void MergeList(LinkList &L1,LinkList &L2)//L2接到L1的后面
{
L1->left->right=L2->right;
L2->right->left=L1->left;
L2->left->right=L1;
L1->left=L2->left;
}
int main()
{
LinkList L;
InitList(L);
LinkList L1;
InitList(L1);
LinkList L2;
InitList(L2);
LinkList L3;
InitList(L3);
int a[7]={1,2,3,4,5,6,7};
TailInsertList(L,a,7);
PrintList(L);
zhaiList(L,L1,L2);
PrintList(L1);
PrintList(L2);
MergeList(L1,L2);
PrintList(L1);
return 0;
}