求教数据结构(c语言版)高手两道题,很急!!!!

(1)假设head是某个带表头结点单向链表的表头指针,每个结点数值字段的类型为整型。请写一个算法,从该链表中删除一个值最大的结点,并将该结点的值存入表头结点的数值字段中。
(2)编写一个递归算法,统计并返回以BT为树跟指针的二叉树中的叶子结点个数。

//第一个:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct myNode
{
int element;
struct myNode *next;
}NODE;

int main(void)
{
int delMax(NODE *h);//删除链表中最大值
void printList(NODE *h);//打印链表
NODE *head=NULL;//链表头
NODE *p=NULL;
NODE *q=NULL;
int i=0;

if( ( head=(NODE *)malloc(sizeof(NODE)) )==NULL )
{
printf("内存不足!");
exit(-1);//退出程序
}
head->element=-1;//初始化head里面数据值为-1
p=head;
//使随即函数rand()随机出来的值每次都不一样
srand( (unsigned int)time(NULL) );
//创建一个链表
for(i=0;i<10;i++)
{
if( ( q=(NODE *)malloc(sizeof(NODE)) )==NULL )
{
printf("内存不足!");
exit(-1);//退出程序
}
q->element=rand()%100+1;//1-100的随机数
q->next=NULL;

p->next=q;
p=p->next;//p始终指向链表末尾
}

printf("原始链表:\n");
printList(head);

delMax(head);

printf("删除最大值后链表:\n");
printList(head);

system("pause");
return 0;
}

void printList(NODE *h)
{
NODE *p=h->next;
printf("head(%3d)->",h->element);

while( p!=NULL )
{
printf("%3d->",p->element);
p=p->next;
}
printf("NULL\n");
}

int delMax(NODE *h)
{
NODE *p=h->next;
int MAX=-1;
//第一遍遍历,找到最大值
while( p!=NULL )
{
if( p->element>MAX )
{
MAX=p->element;
}
p=p->next;
}
//第二遍遍历,删除最大值
p=h->next;
NODE *pFront=h;//pFront指向p前面一个节点
while( p!=NULL )
{
if( p->element==MAX )
{
pFront->next=p->next;
h->element=MAX;
free(p);
return 0;
}
p=p->next;
pFront=pFront->next;
}

return -1;
}

//第二个
#include <stdio.h>
#include <stdlib.h>

typedef struct myBTREE
{
int element;
struct myBTREE *leftTree;
struct myBTREE *rightTree;
}BTREE;

int main(void)
{
int count(BTREE *b);//计算leaf个数,空的树根(只有树根的树)也会看成叶子
int countLeaf(BTREE *b);//纠正count的错误,不把树根看成叶子
void createBtree(BTREE *b);//建立树

BTREE *BT=(BTREE *)malloc(sizeof(BTREE));
BT->element=-1;
BT->leftTree=NULL;
BT->rightTree=NULL;
//这次我就不判断内存不足之类的错误了,麻烦

createBtree(BT);
printf("The count of leafs in BT:%d\n",countLeaf(BT));

system("pause");
return 0;
}

int count(BTREE *b)
{
if( b==NULL )
{
return 0;
}

if( b->leftTree==NULL && b->rightTree==NULL )
{
return 1;
}

return(count(b->leftTree)+count(b->rightTree));
}

int countLeaf(BTREE *b)
{
//判断是否只有树根
if( b->leftTree==NULL && b->rightTree==NULL )
{
return 0;
}

return(count(b->leftTree)+count(b->rightTree));
}

void createBtree(BTREE *b)
{//自己在这里建立树,树根为b,这里我只让树根的左树有值
BTREE *p;
p=(BTREE *)malloc(sizeof(BTREE));
p->element=-1;
p->leftTree=NULL;
p->rightTree=NULL;

b->leftTree=p;
}
温馨提示:内容为网友见解,仅供参考
无其他回答

数据结构(C语言版),求高手解决。。
1.二叉树是度为2的有序树( )【答案】× 2.完全二叉树一定存在度为1的结点( )【答案】× 3.深度为K的二叉树中结点总数≤2k-1( )【答案】√ 4.由一棵二叉树的先序序列和后序序列可以惟一确定它( )【答案】× 5.完全二叉树中,若一个结点没有左孩子,则它必是树叶...

关于数据结构(C语言版)的两个问题
首先,定义一个字符数组`stack`和一个整型变量`top`。`stack`用于存储当前遍历到的括号,`top`表示`stack`的当前栈顶索引。接着,从字符串的第二个字符开始遍历(由于第一个字符默认为左括号),判断当前遍历到的字符:如果为左括号`(`,则将其压入`stack`中,并将`top`加一。如果为右括号`)`,...

数据结构c语言版一道题求解
,element[n - 1]存放线性表中的元素 *\/}; typedef struct SeqList *PSeqList;PSeqList createNullList_seq(int m ) {\/* 创建新的顺序表 *\/ PSeqList palist= (PSeqList)malloc(sizeof(struct SeqList)); if (palist!=NULL){ palist->element= (DataType*)malloc(sizeo...

数据结构c语言版问题
a[10,20]一列10个元素,那么a[6,2],2表示第三列(前面有0,1),前面两列就是20 第三列6个,得到20+6=26,开始地址为200,则200+26=226

数据结构(c语言版)求助,我想了好久都没想出来?
内外层循环关系示意图 其中①是最外层循环,②是中间层循环,④是最内层循环,各语句的执行顺序是:先从最外层循环开始①、 ②、 ③各执行一次,到最内层④后,④连续执行(n+1)次,其内部语句⑤连续执行 n 次 ,然后返回至中间层 ②执行下一次,②每执行一次,③就执行一次,④连续执行(n+1)...

数据结构的习题(C语言版)
第一个问题,分析下要求,可以知道要做的事情是合并两个数组到一个数组里去,数组C的长度是AB之和。表C的第一个字符不是A的第一个字符就是B的第一个字符。因此接下来要做的事情就是做一个长度为AB之和的循环,每一次找出A或B中的最小元素,存到C里面去,循环结束,C就自动有了。第二个问题...

c语言数据结构问题求解
A[0][0]和A[2][2]相差了(2*n+2)个元素,与A[3][3]相差了(3*n+3)个元素,所以,676-644=32,32\/2*3=48,644+48=692,选择c项。满意请采纳呦~

求教一题数据结构(C语言)
五 1.外循环共执行n-2次。对于每次外循环,内循环依次执行:n-2次,n-1次,...2次,1次。内循环共执行1+2+...+n-3+n-2=0.5(n-2)(n-1),所以时间复杂度是O(n^2)。五 2.当i=1时,最内层循环执行1次,当i=2时,最内层循环执行1+(1+2)次,当i=3时,最内层循环执行1+(...

一份C语言的数据结构题目,急求答案
第一题;Search (BiTree t,ElemType x){ struct nodee;{BiTree pp;int tag;}s[100];int top; Bitree p;top=0; p=t;while(p!=NULL&&p->p!=NULL){while(p!=NULL&&p->data!=x){top++;s[top].pp=p;s[top].tag=0;p=p->lchild;} if(p!=NULL&&p->data==x){for(i=1...

急需,求大神解答(数据结构,c语言版)
一共有g (4个),o(6),e(1),s(2),d(2)五种字符 节点数为2*n-1,所以一共有2*5-1=9个节点带权路径由赫夫曼树可以算出 赫夫曼树的的构建方法,每次找两个最小的权值构成子树,他们的和作为一个新的权值参与构建,原来的两个责从权值集合中删除,再找两个集合中最小构成子树,...

相似回答