c語言中函數(shù)節(jié)點數(shù) c語言定義節(jié)點

數(shù)據(jù)結(jié)構(gòu)c語言習(xí)題。編寫一個函數(shù)以二叉查找樹T和兩個有序的關(guān)鍵字 k1,

//?創(chuàng)建二叉樹的原數(shù)組數(shù)據(jù):?40?20?60?10?30?50?70

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名申請、網(wǎng)頁空間、營銷軟件、網(wǎng)站建設(shè)、太康網(wǎng)站維護、網(wǎng)站推廣。

//?前序遍歷序列:?40?20?10?30?60?50?70

//?中序遍歷序列:?10?20?30?40?50?60?70

//?后序遍歷序列:?10?30?20?50?70?60?40

//?輸入關(guān)鍵字k1,k2的數(shù)值:?30?50

//?打印的結(jié)果:

//?40?30?50

//

//?二叉樹示意圖:

//

//???????40

//????/??????\

//???20???????60

//??/??\?????/??\

//?10??30???50???70

#include?"stdio.h"

#include?"stdlib.h"

struct?Tree

{

int?data;

struct?Tree?*left;

struct?Tree?*right;

};

typedef?struct?Tree?TreeNode;

typedef?TreeNode?*Bitree;

Bitree?insertNode(Bitree?root,int?data)?//插入結(jié)點

{

Bitree?newnode;

Bitree?current;

Bitree?back;

newnode=(Bitree)malloc(sizeof(TreeNode));

if(newnode==NULL)

{

printf("\n動態(tài)分配內(nèi)存出錯.\n");

exit(1);

}

newnode-data=data;

newnode-left=NULL;

newnode-right=NULL;

if(root==NULL)

{

return?newnode;

}

else

{

current=root;

while(current!=NULL)

{

back=current;

if(current-data??data)

current=current-left;

else

current=current-right;

}

if(back-data??data)

back-left=newnode;

else

back-right=newnode;

}

return?root;

}

Bitree?createTree(int?*data,int?len)?//創(chuàng)建二叉樹(非遞歸)

{

Bitree?root=NULL;

int?i;

for(i=0;ilen;i++)

{

root=insertNode(root,data[i]);

}

return?root;

}

void?preOrder(Bitree?ptr)?//先序遍歷(遞歸法)

{

if(ptr!=NULL)

{

printf("%d?",ptr-data);

preOrder(ptr-left);

preOrder(ptr-right);

}

}

void?inOrder(Bitree?ptr)?//中序遍歷(遞歸法)

{

if(ptr!=NULL)

{

inOrder(ptr-left);

printf("%d?",ptr-data);

inOrder(ptr-right);

}

}

void?postOrder(Bitree?ptr)?//后序遍歷(遞歸法)

{

if(ptr!=NULL)

{

postOrder(ptr-left);

postOrder(ptr-right);

printf("%d?",ptr-data);

}

}

//根據(jù)關(guān)鍵字k1和k2,進行區(qū)間查找(遞歸法)

void?btreeSearch(Bitree?ptr,int?k1,int?k2)

{

if(ptr!=NULL)

{

if(ptr-data??k1??ptr-data??k2)

{

btreeSearch(ptr-right,k1,k2);

}

else?if(ptr-data?==?k1??ptr-data??k2)

{

printf("%d?",ptr-data);

btreeSearch(ptr-right,k1,k2);

}

else?if(ptr-data??k1??ptr-data??k2)

{

printf("%d?",ptr-data);

btreeSearch(ptr-left,k1,ptr-data);

btreeSearch(ptr-right,ptr-data,k2);

}

else?if(ptr-data??k1??ptr-data?==?k2)

{

printf("%d?",ptr-data);

btreeSearch(ptr-left,k1,k2);

}

else?if(ptr-data??k1??ptr-data??k2)

{

btreeSearch(ptr-left,k1,k2);

}

else?if(ptr-data?==?k1??ptr-data?==?k2)

{

printf("%d?",ptr-data);

}

else

{

printf("其它情況,當(dāng)前節(jié)點的數(shù)值是%d",ptr-data);

}

}

}

int?main()

{

Bitree?T=NULL;?//T是二叉查找樹

int?data[]={40,20,60,10,30,50,70};

int?len;

int?i;

int?k1,k2;?//關(guān)鍵字k1,k2

int?tmp;

len=sizeof(data)/sizeof(int);

printf("創(chuàng)建二叉樹的原數(shù)組數(shù)據(jù):?");

for(i=0;ilen;i++)

{

printf("%d?",data[i]);

}

T=createTree(data,len);?//創(chuàng)建二叉樹

printf("\n前序遍歷序列:?");

preOrder(T);

printf("\n中序遍歷序列:?");

inOrder(T);

printf("\n后序遍歷序列:?");

postOrder(T);

printf("\n輸入關(guān)鍵字k1,k2的數(shù)值:?");

scanf("%d%d",k1,k2);

if(k1k2)

{

tmp=k1;

k1=k2;

k2=tmp;

}

//根據(jù)關(guān)鍵字k1和k2,進行區(qū)間查找(遞歸法)

btreeSearch(T,k1,k2);

printf("\n");

return?0;

}

關(guān)于c語言的,下面這個函數(shù)的功能,說詳細點

void read_file(void) //函數(shù)定義

{

FILE *fp; //文件指針

vistor *p;

fp=fopen("f1.txt","rb");

if(!fp){printf("文件不存在\n");return;}

p=applynode();

while(fscanf(fp,"%s %s %s %s %s",p-number,p-name,p-day,p-time,p-telephone)0)

{

insertnode(p);p=applynode();

}fclose(fp);

}

函數(shù)的功能:

無參函數(shù),void 型。

以2進制方式打開文件f1.txt,用于讀。若打開失敗,顯示 文件不存在,并返回。

若成功,調(diào)用 applynode(); 返回一個 vistor 形指針。

下面開始循環(huán):

從文件讀入5個字符串,放入 vistor 的成員變量 number,name,day,time,telephone,如果讀成功了其中1個或1個以上,則執(zhí)行循環(huán)體:調(diào)用 insertnode(p); 插入這個 節(jié)點p. 再 調(diào)用 applynode(); 返回一個新的 vistor 形指針。

當(dāng) fscanf 沒能讀到數(shù)據(jù),while 循環(huán)結(jié)束。

C語言中數(shù)據(jù)結(jié)構(gòu)中的單向鏈表的問題;

#include "stdlib.h"

#include "stdio.h"

//鏈表的類型定義

typedef struct node

{

int data; //值域

struct node *link; //指針域

}*PNode,*LinkList;

//typedef struct node *PNode;

//typedef struct node *LinkList;

//創(chuàng)建空鏈表

LinkList createNullist_link(void)

{

LinkList list=(LinkList)malloc(sizeof(struct node));//申請表頭結(jié)點空間

if(list!=NULL) list-link=NULL;

else printf("Out of space!\n");//創(chuàng)建失敗

return(list);

}

//判斷空鏈表

int isNullist_linkq(LinkList list)

{

return(list-link==NULL);

}

//在單鏈表中求某元素的存儲位置

PNode locate_link(LinkList list,int x)

{//在list 帶有頭結(jié)點的單鏈表中找第一個值為x的結(jié)點存儲位置

PNode p;

if(list-link==NULL) return(NULL);

p=list-link;

while(p!=NULL p-data!=x) p=p-link;

return(p);

}

// 單鏈表的插入

int insertPost_link(LinkList list,PNode p,int x)

{//在list 帶有頭結(jié)點的單鏈表中,p所指結(jié)點后面插入元素x

PNode q=(PNode )malloc(sizeof(struct node));

if(q==NULL)

{

printf("Out of space!!!\n");

return(0);

}

else

{

q-data=x;

q-link=p-link;

p-link=q;

return(1);

}

}

// 在單鏈表求p所指結(jié)點的前驅(qū)結(jié)點

PNode locatePre_link(LinkList list,PNode p)

{

PNode p1;

if(list-link==NULL) return(NULL);

while(p1!=NULL p1-link!=p) p1=p1-link;

return(p1);

}

// 單鏈表的刪除

int insertPost_link(LinkList list,int x)

{//在list 帶有頭結(jié)點的單鏈表中刪除第一個值為x的結(jié)點

PNode p,q ;

p=list;

if(p-link==NULL) return(0);

while(p-link!=NULL p-link-data!=x)

p=p-link;//找值為x的結(jié)點的前驅(qū)結(jié)點的存儲位置

if(p-link==NULL) //沒找到值為x的結(jié)點

{

printf("Not exist!\n");

return(0);

}

else

{

q=p-link;

p-link=q-link;

free(q);

return(1);

}

}

void main()

{

int i,x;

PNode p;

LinkList list1;

list1=createNullist_link();

if(list1!=NULL)

printf("創(chuàng)建空表成功!\n");

p=list1;

for(i=0;i5;i++)

{

printf("請輸入第 %d 個結(jié)點的值:",i+1);

scanf("%d",x);

insertPost_link(list1,p,x);

p=p-link;

}

printf("\n");

p=list1-link;

while(p!=NULL)

{

if(p-link==NULL)

printf("%d",p-data);

else

printf("%d-",p-data);

p=p-link;

}

printf("\n");

printf("請輸入刪除結(jié)點的值:",i+1);

scanf("%d",x);

insertPost_link(list1,x);

printf("\n");

p=list1-link;

while(p!=NULL)

{

if(p-link==NULL)

printf("%d",p-data);

else

printf("%d-",p-data);

p=p-link;

}

}

你好,請幫忙編寫遞歸和非遞歸算法,在二叉樹中求位于先序序列中第K個位置的結(jié)點,用c語言寫??

#includestdio.h

#includestdlib.h

#define OK 1

#define ERROR 0

#define OVERFLOW -1

typedef struct _Tree{

char data;

struct _Tree *lchild, *rchild;

}Tree;

typedef struct _List{

Tree *data;

struct _List *next;

}List;

typedef struct _stack{

List *top;

int size;

}Stack;

Tree* getTop(Stack stack)

{

if (stack.size 0)

return (stack.top)-data;

return NULL;

}

int Pop(Stack *stack)

{

if (stack-size 0){

List *top = stack-top;

stack-top = top-next;

stack-size--;

free(top);

return OK;

}

return ERROR;

}

int Push(Stack *stack, Tree *tree)

{

List *node = (List*)malloc(sizeof(List));

if (!node) exit(OVERFLOW);

node-data = tree;

node-next = stack-top;

stack-top = node;

stack-size++;

return OK;

}

void init(Tree **tree)

{

//輸入一個字符作為該節(jié)點的數(shù)據(jù),

//如果輸入空格,'_'代表節(jié)點為NULL,先序輸入字符

char data;

*tree = NULL;

data = getchar();

if (data != '_'){

*tree = (Tree*)malloc(sizeof(Tree));

(*tree)-data = data;

init((*tree)-lchild); //初始化左子樹

init((*tree)-rchild); //初始化右子樹

}

}

Tree* findPreKey1(Tree *tree, int K)

{

//二叉樹中求位于先序序列中第K個位置的結(jié)點

//如果函數(shù)返回的結(jié)果為NULL, 則說明不存在

//遞歸版本

Tree* _findPreKey1(Tree *tree, int *p);

int p[1] = {K};

Tree *node;

node = _findPreKey1(tree, p);

return node;

}

Tree* _findPreKey1(Tree *tree, int *p)

{

Tree *node;

if (tree != NULL){

if (*p == 1) //當(dāng)*p == 1時,則這個節(jié)點就是需要查找的節(jié)點

return tree;

else{

if (tree-lchild != NULL){

//如果tree的左子樹不為NULL,結(jié)果即為左子樹的先序序列的第*p-1個元素

(*p)--;

node = _findPreKey1(tree-lchild, p);

}

if (*p == 1) //在左子樹中找到第K個元素,返回結(jié)果

return node;

//當(dāng)在左子樹已經(jīng)遍歷完,此時有*p != 1,即還沒遍歷到第K個元素

if (tree-rchild != NULL){

//如果右子樹不為NULL,此時已經(jīng)遍歷了K-*p + 1個元素,那么結(jié)果即為右子樹的先序

//序列的第*p-1個元素

(*p)--;

node = _findPreKey1(tree-rchild, p);

}

return node;

}

}

return NULL;

}

Tree* findPreKey2(Tree *tree, int K)

{

//二叉樹中求位于先序序列中第K個位置的結(jié)點

//如果函數(shù)返回的結(jié)果為NULL, 則說明不存在

//非遞歸版本

Stack s = {top:NULL, size:0};

List *top;

Tree *node;

f(tree == NULL)

return NULL;

else{

Push(s, tree);

while(K != 1 s.size 0){

node = getTop(s);

Pop(s);

if (node-rchild)

Push(s, node-rchild);

if (node-lchild)

Push(s, node-lchild);

K--;

}

if (K == 1)

return getTop(s);

else

return NULL;

}

}

int main()

{

Tree *tree, *node1, *node2;

int K;

printf("按先序建立二叉樹,'_'(下畫線)代表節(jié)點為NULL:\n");

init(tree);

printf("請輸入先序序列中的第K個位置(注意不要超過樹的節(jié)點數(shù)):\n");

scanf("%d", K);

node1 = findPreKey1(tree, K);

if (node1 != NULL)

printf("(遞歸版本)先序序列中的第%d個位置元素的值為:%c\n", K,node1-data);

else

printf("(遞歸版本)先序序列中不存在第%d個位置元素\n", K);

node2 = findPreKey2(tree, K);

if (node2 != NULL)

printf("(非遞歸版本)先序序列中的第%d個位置元素的值為:%c\n", K,node2-data);

else

printf("(非遞歸版本)先序序列中不存在第%d個位置元素\n", K);

return 0;

}

測試結(jié)果:

按先序建立二叉樹,'_'(下畫線)代表節(jié)點為NULL:

ABC__DE_G__F___

請輸入先序序列中的第K個位置(注意不要超過樹的節(jié)點數(shù)):

6

(遞歸版本)先序序列中的第6個位置元素的值為:G

(非遞歸版本)先序序列中的第6個位置元素的值為:G

雖然代碼顯得有點冗余,不過還望樓主采納!!

C語言 統(tǒng)計線性表中元素的個數(shù),int ListLength(struct Sqlist MyLi

線性表可以直接用malloc申請連續(xù)空間,按數(shù)組保存。但這樣不方便后期增刪。

所以,建議使用鏈表來實現(xiàn)。

下面代碼就是用鏈表實現(xiàn)線性表。

其中initList函數(shù)是生成了一個10節(jié)點的單向鏈表作為線性表。

ListLength就是題目要的函數(shù)。(函數(shù)中順帶打印了鏈表內(nèi)容,你不想要顯示鏈表內(nèi)容,就刪掉printf語句)。

#includestdio.h

#includemalloc.h

struct?Sqlist

{

int?num;

struct?Sqlist?*next;

};

struct?Sqlist?*initList();//初始化一個線性鏈表

int?ListLength(struct?Sqlist?MyList);

int?main()

{

struct?Sqlist?*mylist;

mylist=initList();

printf("\n線性表中元素個數(shù)為:%d\n",ListLength(*mylist));

return?0;

}

int?ListLength(struct?Sqlist?MyList)

{

int?cnt=0;

struct?Sqlist?*headList=MyList;

printf("生成的線性表各元素值為:");

while(headList)

{

printf("%d?",headList-num);

cnt++;

headList=headList-next;

}

return?cnt;

}

struct?Sqlist?*initList()

{

int?i;

struct?Sqlist?*newList=NULL,*firstList=NULL,*lastList=NULL;

for(i=1;i=10;i++)

{

newList=(struct?Sqlist?*)malloc(sizeof(struct?Sqlist));

if(!newList)

return?NULL;

newList-num=i;

newList-next=NULL;

if(!firstList)

firstList=newList;

else

lastList-next=newList;

lastList=newList;

}

return?firstList;

};

分享題目:c語言中函數(shù)節(jié)點數(shù) c語言定義節(jié)點
本文URL:http://muchs.cn/article42/doschhc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗、網(wǎng)站建設(shè)、外貿(mào)建站、網(wǎng)站設(shè)計公司、搜索引擎優(yōu)化網(wǎng)站營銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)