数据结构(使用C语言)相关问题

作者&投稿:汉闵 (若有异议请与网页底部的电邮联系)
数据结构问题C语言的~

权值升序排列,下同
=>2 3 5 7 8 10 15 20 30
1.最小的两个权值2,3组一棵树,根节点权值为2+3=5
=>5* 5 7 8 10 15 20 30
2.最小的两个权值5,5组一棵树,根节点权值为5+5=10
=>7 8 10* 10 15 20 30
3.最小的两个权值7,8组一棵树,根节点权值为7+8=15
=>10* 10 15* 15 20 30
4.最小的两个权值10*,10组一棵树,根节点权值为10+10=20
=>15* 15 20* 20 30
5.最小的两个权值15*,15组一棵树,根节点权值为15+15=30
=>20* 20 30* 30
6.最小的两个权值20*,20组一棵树,根节点权值为20+20=40
=>30* 30 40*
7.最小的两个权值30*,30组一棵树,根节点权值为30+30=60
=>40* 60*
7.最小的两个权值40*,60*组一棵树,根节点权值为40+60=100
=>100* (一棵树,编码完成)
________/\
_______/__\
______/____\
_____/\_____/\
____/\_20__/\_30
___/\_10__/\_15
__/\_5___7_8
_2_3

WPL
=(W1*L1+W2*L2+W3*L3+...+Wn*Ln)
=2*5+3*5+5*4+7*4+8*4+10*3+15*3+20*2+30*2
=280

左孩子前进0,右孩子前进1
A:001
B:01
C:0001
D:101
E:1001
F:00000
G:00001
H:1000
I:11

a.rec_len=0; // 这里有问题。
for(i=0;i<a.rec_len;i++) //由于你上面给了0值,所以,这段循环不会执行。因此,你下面的工作无法实现
{
strcpy(a.rec[i].date,"0");
strcpy(a.rec[i].operate,"0");
a.rec[i].num=0;
}
你直接给记录长度给了0值,那么无论你输入什么东西,都不会进行问题行下面的那个循环。
请看看是否如此,希望能采纳。

#include<stdio.h>
#include<malloc.h>

typedef struct LoopNode
{
int value;
struct LoopNode *next;
}LoopQueNode;

LoopQueNode* CreatLine(int val);//创建头结点
LoopQueNode* InLine(LoopQueNode* FormerNode, int val);//入队函数
void OutLine(LoopQueNode* Node);//出队函数
void LinePrint(LoopQueNode* FirstNode);//打印当前队列
int LoopFree(LoopQueNode* Node);//释放队列

int main()
{
LoopQueNode *FirstNode = NULL, *NodeTem = NULL;
int Val_In = 0;
int Flag = 0, i = 0;

printf("请输入头结点值:
");
scanf("%d",&Val_In);
FirstNode = CreatLine(Val_In);
LinePrint(FirstNode);

//入队10个结点
printf("请输入9个新结点值:
");
NodeTem = FirstNode;
for(i = 0; i < 9; i++)
{
scanf("%d",&Val_In);
NodeTem = InLine(NodeTem,Val_In);
}
LinePrint(FirstNode);

//出队
printf("请输入要删除的值:
");
scanf("%d",&Val_In);
NodeTem = FirstNode;
do{
if(NodeTem -> value == Val_In)
{
OutLine(NodeTem);
break;
}
NodeTem = NodeTem -> next;
}
while(NodeTem != FirstNode);
if(NodeTem == FirstNode)
printf("队列中没有该元素!
");
else
LinePrint(FirstNode);

//释放队列
Flag = LoopFree(FirstNode);
if(Flag == 0)
{
printf("内存未成功释放
");
return 0;
}else
{
printf("内存已成功释放
");
return 1;
}
}
/**********************
初始化函数;
创建头结点并自循环
**********************/
LoopQueNode* CreatLine(int val)
{
LoopQueNode* first_node = NULL;
first_node = (LoopQueNode*)malloc(sizeof(LoopQueNode));
if(first_node == NULL)//检验内存申请是否成功
return NULL;
first_node -> value = val;
first_node -> next  = first_node;
return first_node;
}

/********************************************
入队函数;
输入值为插入位置上一结点和输入结点有效值;
返回值为新结点指针
********************************************/
LoopQueNode* InLine(LoopQueNode* FormerNode, int val)
{
LoopQueNode* newNode = NULL;
if(FormerNode == NULL)
{
return NULL;
}
newNode = (LoopQueNode*)malloc(sizeof(LoopQueNode));
newNode -> value = val;
newNode -> next = FormerNode -> next;//新结点指针指向下一个结点
FormerNode -> next = newNode;
return newNode;
}
/***************************************
出队函数;
输入值为所需释放结点
输出值可判断结点是否成功释放
***************************************/
void OutLine(LoopQueNode* Node)
{
LoopQueNode* NodeTem = NULL;
if(Node == NULL)
return;
NodeTem = Node -> next;
while(NodeTem != Node)//循环至上一结点
{
NodeTem = NodeTem -> next;
if(NodeTem -> next == Node)
break;
}
NodeTem -> next = Node -> next;
free(Node);
Node = NULL;
return;
}

/**************
释放队列
输入任意一个结点指针,释放整个队列
输出释放结果
**************/
int LoopFree(LoopQueNode *Node)
{
LoopQueNode *Node2Free = NULL, *NextNode = NULL;
if(Node == NULL)
return 0;
Node2Free = Node;
do{
NextNode = Node2Free -> next;
free(Node2Free);
Node2Free = NextNode;
}while(Node2Free != Node);
Node = NULL;
return 1;
}

/**************
打印队列
**************/
void LinePrint(LoopQueNode* FirstNode)
{
LoopQueNode *Node = NULL;
if(FirstNode == NULL)
{
printf("当前队列为空!!!
");
return;
}
Node = FirstNode;
printf("当前队列中所有的值为:
");
do{
printf("%d
",Node -> value);
Node = Node -> next;
}while(Node != FirstNode);
}

早上就看到这个问题的,中间一有时间就写一点,终于写完了。。。花了那么多时间,看来水平还需要提高



#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

typedef struct QNode
{
int data;
struct QNode *Next;
}LQNode,*LinkQueue;

bool InitQueue(LinkQueue *rear); //循环队里初始化
bool EnterQueue(LinkQueue *rear,int e); //入队
bool DeleteQueue(LinkQueue *rear,int *e); //出队


int main()
{
LinkQueue Q;
int i, n;
int val;
int e;
InitQueue(&Q);
printf("请输入入队元素的个数 n = ");
scanf("%d",&n);
for(i = 0; i < n; i++)
{
printf("第%d个入队的元素:",i+1);
scanf("%d",&val);
EnterQueue(&Q,val);
}
for(i = 0; i < n; i++)
{
DeleteQueue(&Q,&e);
printf("%d ",e);
}
printf("
");
return 0;
}

bool InitQueue(LinkQueue *rear)
{
*rear = (struct QNode *)malloc(sizeof(struct QNode));
if(*rear == NULL) //内存分配失败
exit(-1); 
else
(*rear)->Next = *rear; //队尾指针指向头结点
return true;
}

bool EnterQueue(LinkQueue *rear,int e)
{
LQNode *s;
s = (struct QNode *)malloc(sizeof(struct QNode));
if(s == NULL)
exit(-1);
s->data = e; //将元素赋值给结点的数据域
s->Next = (*rear)->Next;
(*rear)->Next = s;
*rear = s; //修改队尾指针
return true;
}

bool DeleteQueue(LinkQueue *rear,int *e)
{
LQNode *f, *p;
if(*rear == (*rear)->Next) //在删除队头之前,判断循环队列是否为空
return false;
else
{
f = (*rear)->Next; //使指针f指向头结点
p = f->Next; //使p指向首结点 即第一个存放数据元素的结点
if(p == *rear) //队列中只有一个数据
{
*rear = (*rear)->Next;
(*rear)->Next = *rear; //使指针rear(尾指针)指向头结点
}
else
{
f->Next = p->Next; //使头结点指向要出队的下一个结点
}
*e = p->data; //把队头元素的值赋给e
free(p); //释放指针p指向的结点
}
return true;
}
//根据循环链表改的,终于改出来了



数据结构(C语言版),求高手解决。。
答:【答案】√ 6.用二叉链表存储n个结点的二叉树时,结点的2n个指针中有n+1个空指针( )【答案】√ 7.完全二叉树的存储结构通常采用顺序存储结构( )【答案】√ 8.哈夫曼树是带权路径长度最短的树,路径上权值较大的结点离根较近( )【答案】√ 9.在中序线索二叉树中,每一非...

关于数据结构的问题,用C语言描述
答:二叉树使用二叉链表分别存放他的左右孩子,树利用二叉链表存储孩子及兄弟(称孩子兄弟链表),而森林也是利用二叉链表存储孩子及兄弟。树一章,处处是重点,道道是考题,大家务必个个过关。第六章 图如果说,从线性结构向树形结构研究的转变,是数据结构学科对数据组织形式研究的一次升华,那么从树形结构的研究转到图形结构的研究...

C语言数据结构的一个基本问题
答:1 int read_2D_Array(int **array, int i, int j, int column)2 { //i row j column ,总行数为column 3 return((*(int*)array + i*column + j));4 } 以上函数的参数第一行的int **array是函数参数这个参数说明该函数参数列表一接收的数据类型为int ** 型的变量 ...

c语言版 数据结构问题
答:1.找到结构的头(H)和尾(R)2.下面是伪代码 while(H在R之前) do begin if data_at[H]!=data_at[R] then return false;//肯定不对称 H<-后继;R<-前驱;end;return true;时间复杂度O(strlen(s))既为表长

数据结构(使用C语言)相关问题
答:= NULL;int Val_In = 0;int Flag = 0, i = 0;printf("请输入头结点值:\n");scanf("%d",&Val_In);FirstNode = CreatLine(Val_In);LinePrint(FirstNode);//入队10个结点printf("请输入9个新结点值:\n");NodeTem = FirstNode;for(i = 0; i < 9; i++){scanf("%d"...

数据结构(C语言版)第一二章习题答案
答:第1章绪论习题1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。2.试举一个数据结构的例子,叙述其逻辑结构和存储结构两方面的含义和相互关系。3.简述逻辑结构的四种基本关系并画出它们的关系图。4.存储结构由哪两种基本的存储方法实现?5.选择题(1...

C语言数据结构问题
答:例如:一个有序顺序表为(9,23,26,32,36,47,56,63,79,81),如果要查找56。利用以上折半查找的思想。其中low和high表示两个指针,分别指向待查找元素的下界和上界,指针mid指向low和high的中间位置,即mid=(low+high)/2。将顺序表中的元素从0~9编号。当mid=4时,因为36<56,说明要...

数据结构问题C语言的
答:__/\_20__/\_30 ___/\_10__/\_15 __/\_5___7_8 _2_3 WPL =(W1*L1+W2*L2+W3*L3+...+Wn*Ln)=2*5+3*5+5*4+7*4+8*4+10*3+15*3+20*2+30*2 =280 左孩子前进0,右孩子前进1 A:001 B:01 C:0001 D:101 E:1001 F:00000 G:00001 H:1000 I:11 ...

数据结构(使用C语言)问题
答:然后+进栈;栈:+ 输出:ABD-*E 因为/优先级大于+所以/进栈;栈:+/ 输出:ABD-*EF 左后输出栈中元素,注意,栈的出栈是FILO;栈:输出:ABD-*EF/+;至于准确性,你可以用后缀转中缀的方式检验,就是在后缀表达式中从左到右开始,遇到运算符就提取他前面的两个操作数进行运算。

C语言数据结构的问题,本人是初学者,请各位大侠们帮帮忙!
答:产生顺序表,并输出用户输入的结点值。从键盘输入要插入学生的学号,姓名,将其插入在对应位置上,输出顺序表所有结点值,观察输出结果*/ //#define uchar unsigned char //#define uint unsigned int //#define NULL 0 define LEN sizeof(struct student)struct student //创建简单链表 { long...