今天我们老师下发了这道题目:
设计算法将一个带头结点的单链表A分解为两个具有相同结构的单链表B和C,其中B表的结点为A表中值小于零的结点,而C表的结点为A表中值大于零的结点。
我想都没想这还不简单,于是,我写下如下代码:
Main:
int main()
{
LinkList Tail_Head;
LinkList Tail_Head1;
LinkList Tail_Head2;
int m;
ElemType d[4]={1,-1,-2,2};
Tail_Head=CreateListTail(d,4);
Tail_Head1=CreateListTail(d,2);
Tail_Head2=CreateListTail(d,2);
printf("单链表是:\n");
PrintList_List(Tail_Head);
Classify(Tail_Head,Tail_Head1,Tail_Head2);
printf("\n大于0的数为:");
PrintList_List(Tail_Head1);
printf("\n小于0的数为:");
PrintList_List(Tail_Head2);
printf("\n");
}
void Classify(LinkList head,LinkList head1,LinkList head2)
{
LinkList p,p1,p2;
p=head;
p1=head1;
p2=head2;
while(p->next!=NULL)
{
p=p->next;
if(p->data>=0)
{
p1=p1->next;
p1->data=p->data;
printf("%d",p1->data);
}
else
{
p2=p2->next;
p2->data=p->data;
printf("%d",p2->data);
}
}
}
结果:
我很高兴的提交了作业,不料老师叫我重新看一遍题目,我心想,没问题啊,该实现的都实现了。重新看了一遍题目,发现不对,题目要求是拆分,而我写的是赋值。
于是乎我修改了我的代码:
int main()
{
LinkList Tail_Head;
LinkList Tail_Head1;
LinkList Tail_Head2;
int m;
ElemType d[4]={1,-1,-2,2};
Tail_Head=CreateListTail(d,4);
Tail_Head1=InitList_List();
Tail_Head2=InitList_List();
printf("单链表是:\n");
PrintList_List(Tail_Head);
Classify(Tail_Head,Tail_Head1,Tail_Head2);
printf("\n大于0的数为:");
PrintList_List(Tail_Head1);
printf("\n小于0的数为:");
PrintList_List(Tail_Head2);
printf("\n");
}
void Classify(LinkList &head,LinkList &head1,LinkList &head2)
{
struct Node *p,*p1,*p2;
p=head->next;
head1=new Node;
head2=new Node;
p1=head1;
p2=head2;
while(p){
if(p->data>=0){
p1->next=p;
p=p->next;
p1=p1->next;
p1->next=NULL;
}else if(p->data<0){
p2->next=p;
p=p->next;
p2=p2->next;
p2->next=NULL;
}
}
}
这两个代码虽然结果一致但是意义大不相同;第一个我主要靠
p1=p1->next;
p1->data=p->data;
printf("%d",p1->data);
不仔细看没有问题,但是这是赋值,只能在字符串给定长度时赋值
而第二个代码用
p1->next=p;
p=p->next;
p1=p1->next;
p1->next=NULL;
这是标准的拆分建链,虽然结果一致,但是实现过程不一样,希望看过的读者在学习和工作中不要和博主犯同样的错误了。
附上全部代码:
#include <stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string>
typedef int Status;
typedef int ElemType;
typedef struct Node{
ElemType data; //存放元素值
struct Node *next;//指针域指向后继结点
}Node;
typedef struct Node * LinkList;
LinkList InitList_List(void); //初始化
LinkList CreateListTail(ElemType a[],int n); //建表
void PrintList_List(LinkList head); //输出
void Classify(LinkList &head,LinkList &head1,LinkList &head2); //分类并建表输出
int main()
{
LinkList Tail_Head;
LinkList Tail_Head1;
LinkList Tail_Head2;
int m;
ElemType d[4]={1,-1,-2,2};
Tail_Head=CreateListTail(d,4);
Tail_Head1=InitList_List();
Tail_Head2=InitList_List();
printf("单链表是:\n");
PrintList_List(Tail_Head);
Classify(Tail_Head,Tail_Head1,Tail_Head2);
printf("\n大于0的数为:");
PrintList_List(Tail_Head1);
printf("\n小于0的数为:");
PrintList_List(Tail_Head2);
printf("\n");
}
LinkList InitList_List(void)
{
LinkList head;
head=(Node *)malloc(sizeof(Node));
if(head ==NULL) exit(1);
head->next=NULL;
return head;
}
LinkList CreateListTail(ElemType a[],int n)
{
LinkList head,p,q;
int i;
head=InitList_List();
q=head;
for(i=0;i<n;i++)
{
p=(Node *)malloc(sizeof(Node));
p->data=a[i];
q->next=p;
q=p;
}
p->next=NULL;
return head;
}
void PrintList_List(LinkList head)
{
LinkList p;
p=head;
while(p->next!=NULL)
{
p=p->next;
printf(" %d ",p->data);
}
}
void Classify(LinkList &head,LinkList &head1,LinkList &head2)
{
struct Node *p,*p1,*p2;
p=head->next;
head1=new Node;
head2=new Node;
p1=head1;
p2=head2;
while(p){
if(p->data>=0){
p1->next=p;
p=p->next;
p1=p1->next;
p1->next=NULL;
}else if(p->data<0){
p2->next=p;
p=p->next;
p2=p2->next;
p2->next=NULL;
}
}
}
下面定然有帅哥美女点赞!