在一条无0链表中筛选出一条大于0和一条小于0的链表
算法设计思路:
把ListA进行筛选,把<0放在ListB里,同时在ListA跳过(不用free),最后让ListC与ListA相等。
//链表设计:没有多余的空节点
void separation(List *ListA,List *ListB,List *ListC){
Node *p;
Node *q;
Node *last;
p=ListA->head;
q=NULL;
if(p->next==NULL){//当ListA只存在头节点的情况
if(p->value<0){
ListB->head=p;//使ListB的头节点为p
ListA->head=q;//使ListA的头节点为q
}
}
else{
for (p,q;p;q=p,p=p->next){
if(p->value<0){
if (ListB->head==NULL){
ListB->head=p;//如果ListB是空值。头节点指向p
}
else {
last=ListB->head;
while(last->next){last=last->next;}//使last为ListB的尾节点
last->next=p;//让尾节点指向p
}
q->next=p->next;//把p在ListA中跳过
p->next=NULL;//让ListB的尾节点指向NULL
p=q;//让p等于q继续参与对ListA的遍历
}
}
}
*ListC=*ListA;//让ListC等于ListA
}
结果展示
#include <string.h>
#include "Node.h"
#include "List.h"
#include <iostream>
int main(){
List listA,listB,listC;
int numberA,numberB;
for(int i=5;i>0;i--)
add(&listA,i);
for(int i=-5;i<0;i++)
add(&listA,i);
printf("ListA的元素为\n");
print(&listA);
separation(&listA,&listB,&listC);
printf("ListB的元素为\n");
print(&listB);
printf("ListC的元素为\n");
print(&listC);
}