//將一個(gè)帶頭結(jié)點(diǎn)的單鏈表A分解為兩個(gè)帶頭結(jié)點(diǎn)單鏈表A和B趁猴,使得A表中含有原表中序號為奇數(shù)元素刊咳,而B表中含有原表中序號為偶數(shù)的元素,且保持其相對順序不變儡司。
include <stdio.h>
include <stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
} LNode, *LinkList;
LinkList List_TailInsert(LinkList L)
{
int x; //設(shè)元素類型為整型
L = (LinkList)malloc(sizeof(LNode));
LNode *s, *r = L; //r為表尾指針
printf("請輸入表元素(以999結(jié)尾):");
scanf("%d", &x); //輸入結(jié)點(diǎn)的值
while (x != 999) //輸入999表示結(jié)束
{
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s; //r指向新的表尾結(jié)點(diǎn)
scanf("%d", &x);
}
r->next = NULL; //尾結(jié)點(diǎn)指針置空
return L;
}
void print(LinkList L)
{
while (L->next != NULL)
{
L = L->next;
printf("%d ", L->data);
}
}
LinkList DisCreat_1(LinkList A) //將表中結(jié)點(diǎn)按序號的奇偶性分解到表A或表B中
{
int i = 0; //i記錄A中結(jié)點(diǎn)的序號
LNode *B, *p;
B = (LinkList)malloc(sizeof(LNode)); //創(chuàng)建B表表頭
B->next = NULL; //B表的初始化
LNode *ra = A, *rb = B; //ra和rb將分別指向?qū)?chuàng)建的A表和B表的尾結(jié)點(diǎn)
p = A->next; //p為鏈表工作指針娱挨,指向待分解的結(jié)點(diǎn)
A->next = NULL; //置空新的A表
while (p != NULL)
{
i++; //序號加1
if (i % 2 == 0) //處理序號為偶數(shù)的鏈表結(jié)點(diǎn)
{
rb->next = p; //在B表尾插入新的尾結(jié)點(diǎn)
rb = p; //rb指向新的尾結(jié)點(diǎn)
}
else
{
ra->next = p; //處理原序號為奇數(shù)結(jié)點(diǎn)
ra = p; //在A表尾插入新結(jié)點(diǎn)
}
p = p->next; //將p恢復(fù)為指向新的待處理結(jié)點(diǎn)
}
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;
}
//運(yùn)行結(jié)果: