11.设C= {a1, b1,a2, b2,a3,b3,}为线性表,采用带头结点的hc单链表存放,设计一个就地算法,将其拆分为两个线性表,使得A= {a1,a2,a3}, B= {b3, b2, b1}.
LinkList DisGreat(LinkList &A)
{
LinkList B = (LinkList)malloc(sizeof(LNode));
B->next = NULL;
LNode* p = A->next, * q;
q = (LinkList)malloc(sizeof(LNode));
LNode* ra = A;
while (p != NULL)
{
ra->next = p;
ra = p;
p = p->next;
if (p != NULL)
q = p->next;
p->next = B->next;
B->next = p;
p = q;
}
ra->next = NULL;
return B;
}
总代码测试
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
typedef struct LNode
{
int data;
struct LNode* next;
}LNode, * LinkList;
LinkList List_H(LinkList& L) //头插法插入元素
{
LNode* s;
int x;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
printf("请输入链表元素的值(输入-1结束)\n:");
scanf_s("%d", &x);
while (x != -1)
{
s = (LNode*)malloc(sizeof(LNode));
s->next = NULL;
s->data = x;
s->next = L->next;
L->next = s;
scanf_s("%d", &x);
}
return L;
}
void Del_x(LinkList& L, int x) //递归调用删除所有值为x的元素
{
LNode* p;
if (L == NULL)
return;
if (L->data == x)
{
p = L;
L = L->next;
free(p);
Del_x(L, x);
}
else
Del_x(L->next, x);
}
LinkList PrintfList(LinkList L) //打印元素
{
LNode* p;
p = L->next; //p指向第1号元素
if (p == NULL)
printf("NULL");
else
printf("打印链表中的元素:");
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
return L;
}
LinkList DisGreat(LinkList &A)
{
LinkList B = (LinkList)malloc(sizeof(LNode));
B->next = NULL;
LNode* p = A->next, * q;
q = (LinkList)malloc(sizeof(LNode));
LNode* ra = A;
while (p != NULL)
{
ra->next = p;
ra = p;
p = p->next;
if (p != NULL)
q = p->next;
p->next = B->next;
B->next = p;
p = q;
}
ra->next = NULL;
return B;
}
int main()
{
int x = 0;
LinkList L;
L = (LinkList)malloc(sizeof(LNode));
List_H(L);
PrintfList(L);
LinkList B;
B = (LinkList)malloc(sizeof(LNode));
B = DisGreat(L);
PrintfList(B);
PrintfList(L);
return 0;
}