算法设计习题
源代码可以实现,运行结果看下方截图
设计算法将一个带头结点的单链表A分解为两个具有相同结构的链表B、C,其中B表的结点为A表中值小于零的结点,而C表的结点为A表中值大于零的结点(链表A中的元素为非零整数,要求B、C表利用A表的结点)。
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode, *LinkList;
int InitList(LinkList &L)
{
L = new LNode;
L->next = NULL;
return 1;
}
void TraveList(LinkList L)
{
LNode *p;
p = L->next;
while(p)
{
printf("%d", p->data);
p = p->next;
}
printf("/n");
}
//尾插法建立链表
void CreateList(LinkList &L, int n)
{
L = new LNode;
L->next = NULL;
LNode *r;
r = L;
for(int i=0;i<n;i++)
{
printf("请输入链表第%d个元素的值:" ,i+1);
LNode *s;
s = new LNode;
scanf("%d",&s->data);
s->next = NULL;
r->next = s;
r = s;
}
}
//链表分解
void DisCompose(LinkList &L1, LinkList&L2, LinkList&L3)
{
LNode *p;
p = L1->next; //p为工作指针
L2 = new LNode;
L2->next = NULL;//L2表初始化
L3 = new LNode;//为L3申请结点空间
L3->next = NULL;//L3初始化为空表
while(p!=NULL)
{
LNode *r;
r = p->next;//暂存p的后继
if(p->data < 0)
{
p->next = L2->next;
L2->next = p; //将小于0的结点链入L2 B表,前插法
}
else if(p->data > 0)
{
p->next = L3->next;
L3->next = p; //将大于0的结点链入L3 C表,前插法
}
p = r; //p指向新的待处理结点
}
}
int main()
{
LinkList L1, L2, L3;
if(InitList(L1))
{
printf("L1初始化成功!\n");
}
else
{
printf("L1初始化失败!\n");
}
printf("请输入L1的长度:");
int n;
scanf("%d", &n);
CreateList(L1, n);
TraveList(L1);
DisCompose(L1, L2, L3);
printf("链表分解为L2、L3:\n");
printf("L2:");
TraveList(L2);
printf("L3:");
TraveList(L3);
return 0;
}
运行结果