求C数据结构高手解答!!! 20
1、赫夫曼树的建立任务:建立最优二叉树函数要求:可以建立函数输入二叉树,并输出其赫夫曼树在上交资料中请写明:存储结构、基本算法(可以使用程序流程图)、输入输出、源程序、测...
1、 赫夫曼树的建立
任务 :建立最优二叉树函数
要求:可以建立函数输入二叉树,并输出其赫夫曼树
在上交资料中请写明:存储结构、 基本算法(可以使用程序流程图) 、输入输出、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法;
求大侠给解答一下吧。。。。 我只有20分了。。。。努力争取搞到点分数
拜谢帮忙。。。。。。急用!! 展开
任务 :建立最优二叉树函数
要求:可以建立函数输入二叉树,并输出其赫夫曼树
在上交资料中请写明:存储结构、 基本算法(可以使用程序流程图) 、输入输出、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法;
求大侠给解答一下吧。。。。 我只有20分了。。。。努力争取搞到点分数
拜谢帮忙。。。。。。急用!! 展开
1个回答
展开全部
请仔细对比!!!,你的程序有很多不对的地方。看我是哪些地方和你不一样的!!!
此程序我已经调试并测试通过了。
如果你要运行这个程序,注意把汉字全部去掉!!!
#include<stdio.h>
#include<malloc.h>
#include <stdlib.h>
typedef struct node
{
int data;
node *next;
}node;//你结构体定义错误!!!!
struct node *creat(int num)
{
struct node *p,*q,*head;
int i;
p = (struct node *)malloc(sizeof(struct node));
head = p;
q = p;
for(i=0;i<num-1;i++)
{
p = (struct node *)malloc(sizeof(struct node));
q->next = p;
q = p;
}
p->next = NULL;
return head;
}
void input(struct node *head)
{
struct node *p;
p = head;
while(p->next != NULL)
{
scanf("%d",&(p->data));
p = p->next;
}
scanf("%d",&(p->data));
}
void output(struct node *head)
{
struct node *q;
q = head;
while(q->next != NULL)
{
printf("%d ",q->data);
q = q->next;
}
printf("%d\n",q->data);
}
void main()
{
struct node *A,*B,*C;
struct node *head=NULL;//先给一个初始值,头结点只赋值一次。用空判断
int a,b,i;
printf("请输入A链表的元素个数:\n");
scanf("%d",&a);
A = creat(a);
printf("请按从小到大的顺序输入A链表元素:\n");
input(A);
output(A);
printf("请输入B链表的元素个数:\n");
scanf("%d",&b);
B = creat(b);
printf("请按从小到大的顺序输入B链表元素:\n");
input(B);
output(B);
for(;;)//退出循环用空来判断
{
if(A!= NULL && B!= NULL)
{
if(A->data < B->data)
{
if(!head)//判断头结点指向哪个,只执行一次!! 下同
{
head=A;
C=head;
}
else
{
C->next=A;//此处应该这样;
C=C->next;
}
A = A->next;
}
else if(A->data == B->data)
{
if(!head)
{
head=A;
C=head;
}
else
{
C->next=A;
C=C->next;
}
A = A->next;
B = B->next;
}
else if(A->data > B->data)
{
if(!head)
{
head=B;
C=head;
}
else
{
C->next=B;
C=C->next;
}
B = B->next;
}
}
else
break;//跳出循环
}
//以下代码从循环拿出来,因为下面代码只执行一次就够了,没必要循环
if(A == NULL && B == NULL)
{
}
else if(A != NULL && B == NULL)
{
C ->next= A;//只需要这样就行了,。。。
}
else if(A == NULL && B != NULL)
{
C ->next= B;
}
printf("AB链表合并后的链表C中各元素依次为:\n");
output(head);//必须先输出再释放,不然你节点都释放了,怎么输出啊!!!
free(head);//此时不能free(A),free(B),因为此时A,B,节点的次序已经完全打乱了,节点已经完全链接到head了,只需要释放head就行了。
}
如有不对,欢迎赐教!!!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询