//?創(chuàng)建二叉樹的原數(shù)組數(shù)據(jù):?40?20?60?10?30?50?70
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡(jiǎn)單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名申請(qǐng)、網(wǎng)頁(yè)空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、太康網(wǎng)站維護(hù)、網(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é)點(diǎn)
{
Bitree?newnode;
Bitree?current;
Bitree?back;
newnode=(Bitree)malloc(sizeof(TreeNode));
if(newnode==NULL)
{
printf("\n動(dòng)態(tài)分配內(nèi)存出錯(cuò).\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,進(jìn)行區(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é)點(diǎn)的數(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,進(jìn)行區(qū)間查找(遞歸法)
btreeSearch(T,k1,k2);
printf("\n");
return?0;
}
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進(jìn)制方式打開文件f1.txt,用于讀。若打開失敗,顯示 文件不存在,并返回。
若成功,調(diào)用 applynode(); 返回一個(gè) vistor 形指針。
下面開始循環(huán):
從文件讀入5個(gè)字符串,放入 vistor 的成員變量 number,name,day,time,telephone,如果讀成功了其中1個(gè)或1個(gè)以上,則執(zhí)行循環(huán)體:調(diào)用 insertnode(p); 插入這個(gè) 節(jié)點(diǎn)p. 再 調(diào)用 applynode(); 返回一個(gè)新的 vistor 形指針。
當(dāng) fscanf 沒能讀到數(shù)據(jù),while 循環(huán)結(jié)束。
#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));//申請(qǐng)表頭結(jié)點(diǎn)空間
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);
}
//在單鏈表中求某元素的存儲(chǔ)位置
PNode locate_link(LinkList list,int x)
{//在list 帶有頭結(jié)點(diǎn)的單鏈表中找第一個(gè)值為x的結(jié)點(diǎn)存儲(chǔ)位置
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é)點(diǎn)的單鏈表中,p所指結(jié)點(diǎn)后面插入元素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é)點(diǎn)的前驅(qū)結(jié)點(diǎn)
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é)點(diǎn)的單鏈表中刪除第一個(gè)值為x的結(jié)點(diǎn)
PNode p,q ;
p=list;
if(p-link==NULL) return(0);
while(p-link!=NULL p-link-data!=x)
p=p-link;//找值為x的結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)的存儲(chǔ)位置
if(p-link==NULL) //沒找到值為x的結(jié)點(diǎn)
{
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("請(qǐng)輸入第 %d 個(gè)結(jié)點(diǎn)的值:",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("請(qǐng)輸入刪除結(jié)點(diǎn)的值:",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;
}
}
#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)
{
//輸入一個(gè)字符作為該節(jié)點(diǎn)的數(shù)據(jù),
//如果輸入空格,'_'代表節(jié)點(diǎn)為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個(gè)位置的結(jié)點(diǎn)
//如果函數(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時(shí),則這個(gè)節(jié)點(diǎn)就是需要查找的節(jié)點(diǎn)
return tree;
else{
if (tree-lchild != NULL){
//如果tree的左子樹不為NULL,結(jié)果即為左子樹的先序序列的第*p-1個(gè)元素
(*p)--;
node = _findPreKey1(tree-lchild, p);
}
if (*p == 1) //在左子樹中找到第K個(gè)元素,返回結(jié)果
return node;
//當(dāng)在左子樹已經(jīng)遍歷完,此時(shí)有*p != 1,即還沒遍歷到第K個(gè)元素
if (tree-rchild != NULL){
//如果右子樹不為NULL,此時(shí)已經(jīng)遍歷了K-*p + 1個(gè)元素,那么結(jié)果即為右子樹的先序
//序列的第*p-1個(gè)元素
(*p)--;
node = _findPreKey1(tree-rchild, p);
}
return node;
}
}
return NULL;
}
Tree* findPreKey2(Tree *tree, int K)
{
//二叉樹中求位于先序序列中第K個(gè)位置的結(jié)點(diǎn)
//如果函數(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é)點(diǎn)為NULL:\n");
init(tree);
printf("請(qǐng)輸入先序序列中的第K個(gè)位置(注意不要超過樹的節(jié)點(diǎn)數(shù)):\n");
scanf("%d", K);
node1 = findPreKey1(tree, K);
if (node1 != NULL)
printf("(遞歸版本)先序序列中的第%d個(gè)位置元素的值為:%c\n", K,node1-data);
else
printf("(遞歸版本)先序序列中不存在第%d個(gè)位置元素\n", K);
node2 = findPreKey2(tree, K);
if (node2 != NULL)
printf("(非遞歸版本)先序序列中的第%d個(gè)位置元素的值為:%c\n", K,node2-data);
else
printf("(非遞歸版本)先序序列中不存在第%d個(gè)位置元素\n", K);
return 0;
}
測(cè)試結(jié)果:
按先序建立二叉樹,'_'(下畫線)代表節(jié)點(diǎn)為NULL:
ABC__DE_G__F___
請(qǐng)輸入先序序列中的第K個(gè)位置(注意不要超過樹的節(jié)點(diǎn)數(shù)):
6
(遞歸版本)先序序列中的第6個(gè)位置元素的值為:G
(非遞歸版本)先序序列中的第6個(gè)位置元素的值為:G
雖然代碼顯得有點(diǎn)冗余,不過還望樓主采納!!
線性表可以直接用malloc申請(qǐng)連續(xù)空間,按數(shù)組保存。但這樣不方便后期增刪。
所以,建議使用鏈表來實(shí)現(xiàn)。
下面代碼就是用鏈表實(shí)現(xiàn)線性表。
其中initList函數(shù)是生成了一個(gè)10節(jié)點(diǎn)的單向鏈表作為線性表。
ListLength就是題目要的函數(shù)。(函數(shù)中順帶打印了鏈表內(nèi)容,你不想要顯示鏈表內(nèi)容,就刪掉printf語(yǔ)句)。
#includestdio.h
#includemalloc.h
struct?Sqlist
{
int?num;
struct?Sqlist?*next;
};
struct?Sqlist?*initList();//初始化一個(gè)線性鏈表
int?ListLength(struct?Sqlist?MyList);
int?main()
{
struct?Sqlist?*mylist;
mylist=initList();
printf("\n線性表中元素個(gè)數(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語(yǔ)言中函數(shù)節(jié)點(diǎn)數(shù) c語(yǔ)言定義節(jié)點(diǎn)
本文URL:http://jinyejixie.com/article42/doschhc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、網(wǎng)站建設(shè)、外貿(mào)建站、網(wǎng)站設(shè)計(jì)公司、搜索引擎優(yōu)化、網(wǎng)站營(yíng)銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)