//将一个带头结点的单链表A分解为两个带头结点单链表A和B,使得A表中含有原表中序号为奇数元素,而B表中含有原表中序号为偶数的元素,且保持其相对顺序不变。
include <stdio.h>
include <stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
} LNode, *LinkList;
LinkList List_TailInsert(LinkList L)
{
int x; //设元素类型为整型
L = (LinkList)malloc(sizeof(LNode));
LNode *s, *r = L; //r为表尾指针
printf("请输入表元素(以999结尾):");
scanf("%d", &x); //输入结点的值
while (x != 999) //输入999表示结束
{
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s; //r指向新的表尾结点
scanf("%d", &x);
}
r->next = NULL; //尾结点指针置空
return L;
}
void print(LinkList L)
{
while (L->next != NULL)
{
L = L->next;
printf("%d ", L->data);
}
}
LinkList DisCreat_1(LinkList A) //将表中结点按序号的奇偶性分解到表A或表B中
{
int i = 0; //i记录A中结点的序号
LNode *B, *p;
B = (LinkList)malloc(sizeof(LNode)); //创建B表表头
B->next = NULL; //B表的初始化
LNode *ra = A, *rb = B; //ra和rb将分别指向将创建的A表和B表的尾结点
p = A->next; //p为链表工作指针,指向待分解的结点
A->next = NULL; //置空新的A表
while (p != NULL)
{
i++; //序号加1
if (i % 2 == 0) //处理序号为偶数的链表结点
{
rb->next = p; //在B表尾插入新的尾结点
rb = p; //rb指向新的尾结点
}
else
{
ra->next = p; //处理原序号为奇数结点
ra = p; //在A表尾插入新结点
}
p = p->next; //将p恢复为指向新的待处理结点
}
ra->next = NULL;
rb->next = NULL;
return B;
}
int main()
{
LinkList L, A, B;
LNode *p;
int e, i;
A = (LinkList)malloc(sizeof(LNode));
A = List_TailInsert(L);
printf("尾插法建立的单链表:");
print(A);
printf("\n");
B = DisCreat_1(A);
print(A);
printf("\n");
print(B);
printf("\n");
return 0;
}
//运行结果: