链表赋值和链表拆分,别傻傻的分不清了

      今天我们老师下发了这道题目:
      设计算法将一个带头结点的单链表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;
		}
	}
}

下面定然有帅哥美女点赞!

猜你喜欢

转载自blog.csdn.net/The_Handsome_Sir/article/details/105980129