设C={a1,b1,a2,b2,…,an,bn}为线性表,采用带头结点的hc单链表存放,设计一个就地算法,将其拆分为两个线性表,使得A={a1,a2,…,an},B={bn,…b1}
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode { //定义单链表结点类型
int data;//数据域
struct LNode *next;//指针域
} LNode, *LinkList;
/*设C={a1,b1,a2,b2,...,an,bn}为线性表,采用带头结点的hc单链表存放,
设计一个就地算法,将其拆分为两个线性表,
使得A={a1,a2,...,an},B={bn,...b1}*/
/*算法思想:
奇数采用尾插法插入A中,偶数采用头插法插入B中*/
LinkList split(LinkList &A) {
LinkList B = (LinkList)malloc(sizeof(LNode)) ;
B->next = NULL;
B->data = 999999;
LNode *ra = A, *p , *q;//ra始终指向A的尾结点
p = A->next;//p为工作指针,指向带分解的结点
while(p!=NULL) {
ra->next = p;//将*p链到A的表尾
ra = p;
p=p->next;
if(p!=NULL) {
q=p->next;//头插后,*p将断链,因此用q记忆*p的后继
p->next = B->next;//将*p插入到B的前端
B->next = p;
p=q;
}
}
ra->next=NULL;//A尾结点的next域置空
return B;
}
//带头结点尾插法建立单链表
LinkList List_TailInsert(LinkList &L) { //正向建立单链表
int x;
L=(LinkList)malloc(sizeof(LNode));
L->data=999999;
LNode *s, *r=L;//r为表为指针
printf("请输入数值\n");
scanf("%d",&x);
while(x!=9999) { //输入 9999表示结束
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) {
printf("\n");
if(L->next==NULL)
printf("该链表为空");
LNode *p= L->next;
while(p!=NULL) {
printf("%d ",p->data);
p=p->next;
}
}
int main() {
LinkList A=NULL,B=NULL;
int x;
List_TailInsert(A);
print(A);
B = split(A);
print(A);
print(B);
return 0;
}