将一个带头结点的单链表分解成两个单链表
题目描述:
/*
设计一个算法,将一个带头结点的单链表分解成两个具有相同结构的
链表B和C,其中B白哦的结点为A中小于0的结点,C表的结点为A中大于0 的结点,
要求B和C 仍利用A表的结点。 (A表的元素都是非0元素)
*/
算法思想:‘
假设原来的链表是LA,将LA,分解成LB和LC,首先需要生成两个头结点,LB和LC;设置三个指针*pa,*pb,*pc,初始时,pa指向LA的第一个结点,pb指向LB的头结点,pc指向LC的头结点;然后遍历LA,当pa->data>0时,就将pa指向的结点插入到LB的后面,即pb->next=pa,然后让pb指向该结点,即pb=pb->next,指针pa后移pa=pa->next,表LB最后一个结点的指针域置空。当pa->data<0时,就将pa指向的结点插入到LC的后面,即pc->next=pa,然后让pc指向该结点,即pc=pc->next,指针pa后移pa=pa->next,表LC最后一个结点的指针域置空。
描述如下:
void Resolve(LinkList &LA,LinkList &LB,LinkList &LC){
struct LNode *pa,*pb,*pc;
pa=LA->next;
LB=new LNode;
LC=new LNode;//要生成两个新的头结点!!!
//LB=LC=LA;//不能这样写,这样写最后输出的LB和LChi一样的表,居然会一样??为什么??
pb=LB;
pc=LC;
struct LNode *p;
p=pa;
while(pa){
if(pa->data>0){
pb->next=pa;
pa=pa->next;
pb=pb->next;
pb->next=NULL;
}else if(pa->data<0){
pc->next=pa;
pa=pa->next;
pc=pc->next;
pc->next=NULL;
}
}
}
实现:
/*
设计一个算法,将一个带头结点的单链表分解成两个具有相同结构的
链表B和C,其中B白哦的结点为A中小于0的结点,C表的结点为A中大于0 的结点,
要求B和C 仍利用A表的结点。 (A表的元素都是非0元素)
*/
#include<stdio.h>
#define MAX 100
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
int InitList(LinkList &L){
L=new LNode;
L->next=NULL;
return 1;
}
int ListLength(LinkList L){
int length=0;
struct LNode *p;
p=L->next;
while(p){
++length;
p=p->next;
}
return length;
}
void TraveList(LinkList L){
struct 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;
struct LNode *p;
p=L;
for(int i=0;i<n;i++){
struct LNode *s;
s=new LNode;
printf("请输入%d个结点的值:",i+1);
scanf("%d",&s->data);
s->next=NULL;
p->next=s;
p=s;
}
}
void Resolve(LinkList &LA,LinkList &LB,LinkList &LC){
struct LNode *pa,*pb,*pc;
pa=LA->next;
LB=new LNode;
LC=new LNode;//要生成两个新的头结点!!!
//LB=LC=LA;//不能这样写,这样写最后输出的LB和LChi一样的表,居然会一样??为什么??
pb=LB;
pc=LC;
struct LNode *p;
p=pa;
while(pa){
if(pa->data>0){
pb->next=pa;
pa=pa->next;
pb=pb->next;
pb->next=NULL;
}else if(pa->data<0){
pc->next=pa;
pa=pa->next;
pc=pc->next;
pc->next=NULL;
}
}
}
int main(){
LinkList LA,LB,LC;
if(LinkList(LA)){
printf("LA初始化成功!\n");
}else{
printf("LA初始化失败!\n");
}
if(LinkList(LB)){
printf("LB初始化成功!\n");
}else{
printf("LB初始化失败!\n");
}
if(LinkList(LC)){
printf("LC初始化成功!\n");
}else{
printf("LC初始化失败!\n");
}
printf("请输入LA的长度:");
int n1;
scanf("%d",&n1);
CreateList(LA,n1);
TraveList(LA);
Resolve(LA,LB,LC);
TraveList(LB);
TraveList(LC);
return 0;
}
//修改一下,上面那个main方法里写的有问题,我们这里把初始化的InitList()方法用上,将新的链表LB和LC的初始化工作使用InitList()里进行:
#include<stdio.h>
#define MAX 100
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
int InitList(LinkList &L){
L=new LNode;
L->next=NULL;
return 1;
}
int ListLength(LinkList L){
int length=0;
struct LNode *p;
p=L->next;
while(p){
++length;
p=p->next;
}
return length;
}
void TraveList(LinkList L){
struct 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;
struct LNode *p;
p=L;
for(int i=0;i<n;i++){
struct LNode *s;
s=new LNode;
printf("请输入%d个结点的值:",i+1);
scanf("%d",&s->data);
s->next=NULL;
p->next=s;
p=s;
}
}
void Resolve(LinkList &LA,LinkList &LB,LinkList &LC){
struct LNode *pa,*pb,*pc;
pa=LA->next;
//LB=new LNode;
//LC=new LNode;//要生成两个新的头结点!!!
//LB=LC=LA;//不能这样写,这样写最后输出的LB和LChi一样的表,居然会一样??为什么??
pb=LB;
pc=LC;
while(pa){
if(pa->data>0){
pb->next=pa;
pa=pa->next;
pb=pb->next;
pb->next=NULL;
}else if(pa->data<0){
pc->next=pa;
pa=pa->next;
pc=pc->next;
pc->next=NULL;
}
}
}
int main(){
LinkList LA,LB,LC;
if(InitList(LA)){
printf("LA初始化成功!\n");
}else{
printf("LA初始化失败!\n");
}
if(InitList(LB)){
printf("LB初始化成功!\n");
}else{
printf("LB初始化失败!\n");
}
if(InitList(LC)){
printf("LC初始化成功!\n");
}else{
printf("LC初始化失败!\n");
}
printf("请输入LA的长度:");
int n1;
scanf("%d",&n1);
CreateList(LA,n1);
if(ListLength(LA)>0){
printf("输出链表A:");
}
TraveList(LA);
Resolve(LA,LB,LC);
if(ListLength(LB)>0){
printf("输出链表B:");
}
TraveList(LB);
if(ListLength(LC)>0){
printf("输出链表C:");
}
TraveList(LC);
return 0;
}