数据结构 运行实例

数据结构 运行实例,第1张

不知你要什么实例,我辩誉只有一个中缀表达式转后缀表达式求解的程序:

#include "stdio.h"

#include "stdlib.h"

typedef struct snode

{

char data

struct snode *next

}Node

void Inist (Node **head) //栈的初始化

{

if((*head=(Node *)malloc(sizeof(Node)))==NULL)

(*head)->next=NULL

}

int NotEmpty(Node *head)//判断是否非空

{

if(head->next==NULL) return 0

else return 1

}

int Push(Node *head,char x) //入栈携慎段

{

Node *p

if((p=(Node *)malloc(sizeof(Node)))==NULL)

{

printf("内存空间不足无法插入")

return 0

}

p->data=x

p->next=head->next

head->next=p

return 1

}

int Pop(Node *head,char *x) //出栈

{

Node *p=head->next

if(p==NULL)

{

printf("堆栈已空出错!")

return 0

}

head->next=p->next

*x=p->data

free(p)

return 1

}

int Gettop(Node *head,char *x) //取栈顶元素

{

Node *p=head->next

if(p==NULL)

{

printf("堆栈已空出错!")

return 0

}

*x=p->data

return 1

}

int Compare(char a,char b) //比较 *** 作符优先级

{

if((a=='+'||a=='-')&&(b=='*'||b=='/'||b=='('))

return '<'

else if ((a=='*'||a=='/')&&b=='(')

return '<'

else if (a=='('&&(b=='+'||b=='-'||b=='*'||b=='/'||b=='('))

return '<'

else if (a=='('&&b==')')

return '='

else if (a=='#'&&(b=='+'||b=='-'||b=='*'||b=='/'||b=='('))

return '<'

else if (a=='#'&&b=='#')

return '孝森='

else

return '>'

}

int Houzhui(char Original[],int n,char save[]) //中缀变后缀

{

Node *s

char x1,x2,y

int i

int j=0

Inist(&s)

Push(s,'#')

for(i=0i<ni++)

{

x1=Original[i]

if(x1<='9'&&x1>='0')

{

save[j]=x1 //将数字保存在数组save中

j++

y=Original[i+1]

if(y=='+'||y=='-'||y=='*'||y=='/'||y=='('||y==')'||y=='#')

{

save[j]=' ' //在数字后面, *** 作符前面加空格

j++

}

}

else

{

Gettop(s,&x2) //取栈顶元素进行比较

if(Compare(x2,x1)=='<') //栈顶元素低级就将X1进栈

Push(s,x1)

else if(Compare(x2,x1)=='>') //栈顶元素高级就将X2出栈

{

Pop(s,&x2)

save[j]=x2 //将 *** 作符X2保存在数组save中

j++

i--

}

else if(Compare(x2,x1)=='=')

Pop(s,&x2) //优先级相同就将X2出栈

}

}

save[j]='#' //后缀表达式以'#'号结束

return j//返回数组save的长度

}

void Count(char p[]) //后缀表达式求值

{

int s[100]

int i,j

i=j=0

while(p[j]!='#')

{

switch(p[j])

{

case '+': //将 *** 作符前面的两个数值相加

s[i-2]=s[i-2]+s[i-1]

i=i-1

break

case '-': //将 *** 作符前面的两个数值相减

s[i-2]=s[i-2]-s[i-1]

i=i-1

break

case '*': //将 *** 作符前面的两个数值相乘

s[i-2]=s[i-2]*s[i-1]

i=i-1

break

case '/': //将 *** 作符前面的两个数值相除

s[i-2]=s[i-2]/s[i-1]

i=i-1

break

case '0':

case '1':

case '2':

case '3':

case '4':

case '5':

case '6':

case '7':

case '8':

case '9':

s[i]=(int)p[j]-48

//将数字字符char型向int类型转换

j++

while(p[j]!=' ')

//判断一个 *** 作数是否结束,每个 *** 作数都是以空格结束

{

s[i]=s[i]*10+(int)p[j]-48 //求出数字字符的值

j++

}

i++

break

}

j++

}

printf("\n计算的结果为: %d",s[0])

}

void main()

{

int m

int i=0

int k

char save[100]

char a[100]

printf("输入字符串,并以#号结束 \n")

for(m=0m<100m++) //输入表达式字符串

{

scanf("%c",&a[m])

if(a[m]=='#')break

}

k=Houzhui(a,m+1,save)//调用函数houzhui

printf("后缀表达式为:")

for(m=0m<km++)

printf("%c",save[m])

Count(save) //调用函数ji_suan

printf("\n")

}

第一个程序有两个错误:

错误一:

SeqList *L

init_SeqList(L)

应改成:

SeqList s

SeqList *L = &s

init_SeqList(L)

错误原因:指针只有在初始化(即只有在指向具体对象)之后才可以参与运算,你只定义了一个指针,并未将指针指向具体的对象,当执行到init_SeqList(L)这句时,会产生越界报错。

错误二:

printf("%d\t%s\n"肢兆消,L->elem[1].data,L->elem[1].n)

这个语句打印出来的永远是第一个元素,而不是删除的元素,应改成:

printf("%d\t%s\n",L->elem[i].data,L->elem[i].n)//其中i为被删除元素的下标

提示:

给数组赋值历知时,循环最好从i=0开始,for(i=1i<=2i++)你从i=1开始,实际上是将值赋给了数组的第二个元素猜没。

这是个二叉排咐慧序树例题,希望对你有帮助!

#include

"stdio.h"

#

include

"stdlib.h"

struct

Bnode

{int

data

struct

Bnode

*lchild,*rchild

}

void

insertbst(Bnode

*&t,

Bnode

*s)

{if

(t==

NULL)

t=s

else

if

(s->data<

t->data)

insertbst(t->

lchild,s)

else

insertbst(t->

rchild,s)

}

void

inorder(Bnode

*t)

{

if

(t!=NULL)

{

inorder(t->lchild)

printf("%d

",

t->data)

inorder(t->rchild)

}

}

void

main()

{int

i,x

Bnode

*t=NULL,*s

for

(i=1i<=4i++)

{scanf("%d",&x)

s=(

Bnode

*)malloc(sizeof(Bnode))

s->data=x

s->

lchild=

NULL

s->

rchild=

NULL

printf("搏和\n"衡银答)

insertbst(t,s)

}

inorder(

t)

printf("\n")

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12454586.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存