在做一些和結構體有關的指標、函數參數的資料結構時遇到的一些問題

來源:互聯網
上載者:User

 //stacktest.cpp<br />#include<stdio.h><br />#include<stdlib.h><br />#define init_size 100<br />int stackincrement=100;<br />typedef struct SqStack<br />{<br /> int *base;<br /> int *top;<br /> int stacksize;<br />};<br />int create_stack_sq(SqStack *s) //可用<br />{</p><p> s->base=(int *)malloc(init_size*sizeof(int));<br /> if(!s->base)<br /> {<br /> printf("分配失敗");<br /> exit(0);<br /> }<br /> s->top=s->base;<br /> s->stacksize=init_size;<br /> //return s;<br />}<br />int push(SqStack *s,int t)<br />{<br /> if(s->top-s->base>=s->stacksize)<br /> {<br /> s->base=(int *)realloc(s->base,(s->stacksize+stackincrement)*sizeof(int));<br /> if(!s->base)<br /> {<br /> printf("分配失敗/n");<br /> exit(0);<br /> }<br /> s->top=s->base+s->stacksize;<br /> s->stacksize+=stackincrement;<br /> }<br /> *s->top=t;<br /> s->top++;<br />}<br />int pop(SqStack *s)<br />{<br /> if(s->top==s->base)<br /> exit(0);<br /> return *--s->top;<br />}<br />int empty_stack_sq(SqStack *s)<br />{<br /> if((*s).base==(*s).top)<br /> {<br /> printf("空棧/n");<br /> return 0;<br /> }<br /> else {<br /> printf("非空棧/n");<br /> return 1;<br /> }<br />}<br />int destroy_stack_sq(SqStack *s)<br />{<br /> free((*s).base);<br /> (*s).base=NULL;<br /> (*s).top=NULL;<br /> (*s).stacksize=0;<br /> return 1;</p><p>}</p><p>void output_stack_sq(SqStack *s)<br />{<br /> if((*s).top==(*s).base)<br /> printf("空棧/n");<br /> int *t;<br /> t=s->top;<br /> while(t>s->base)<br /> {<br /> printf("%d ",*--(t));<br /> //t++;<br /> }<br /> printf("/n");<br />}<br />int gettop_stack_sq(SqStack *s)<br />{<br /> int t;<br /> int *k;</p><p> if(s->top>s->base)<br /> {<br /> k=s->top-1;<br /> return *k;<br /> }<br /> else {<br /> printf("空棧/n");<br /> return -10000;<br /> }<br />}</p><p>int main()<br />{<br /> int i=0;<br /> struct SqStack s;//問題出在這裡,見下段<br /> create_stack_sq(&s);<br /> for(i=0;i<10;i++)<br /> push(&s,i);<br /> output_stack_sq(&s);<br /> printf("/n");<br /> printf("%d/n",gettop_stack_sq(&s));<br /> for(i=0;i<10;i++)<br /> {<br /> int t=pop(&s);<br /> printf("%d/n",t) ;<br /> }<br /> //destroy_stack_sq(&s);<br /> empty_stack_sq(&s);<br /> output_stack_sq(&s);<br /> system("pause");<br />}</p><p>

main函數裡聲明的是一個結構體變數s,這樣的話程式能正常輸入、顯示。

但是如果聲明為一個結構體指標變數,struct SqStack *s的話,程式會不正常。

在程式調試的時候我可以得出這樣的觀點嗎?

但是我不知道該怎麼解釋這個現象,我覺得這個問題在以後的代碼還會出現,果不其然,出現在二叉樹的調試上了。

//對結構體和結構體指標的操作是導致本程式bug的根本原因<br /> //於棧而言,聲明一個棧元素比聲明一個棧指標要好。<br />

 

 

//bitreetest.cpp<br />#include<stdio.h><br />#include<stdlib.h><br />typedef struct BiTNode<br />{<br /> int v;<br /> struct BiTNode *lchild,*rchild;<br />}BiTree,*b;<br />BiTree *create_BiTree(b &T) //問題在這裡 {<br /> int t;<br /> printf("請輸入元素值以構造二叉樹/n");<br /> scanf("%d",&t);<br /> if(t==-10000)<br /> {<br /> T=NULL;<br /> return T;<br /> }<br /> else {<br /> T=(BiTNode *)malloc(sizeof(BiTNode));<br /> if(!T)<br /> exit(0);<br /> T->v=t;<br /> create_BiTree(T->lchild);<br /> create_BiTree(T->rchild);<br /> return T;<br /> } </p><p>}<br />void PreorderTraverse(BiTree *T)<br />{<br /> if(T==NULL)<br /> return ;<br /> else {<br /> printf("%d ",T->v);//system("pause");<br /> PreorderTraverse(T->lchild);<br /> PreorderTraverse(T->rchild);<br /> }</p><p>}<br />int main()<br />{<br /> struct BiTNode *T;<br /> T=create_BiTree(T);<br /> printf("建立完畢/n");<br /> PreorderTraverse(T);<br /> system("pause");<br />}<br />// 1 2 3 4 -10000 -10000 -10000 -10000 -10000</p><p>

問題在於只能對函數參數進行這樣設定:先定義結構體的指標結構*b,在用b &T,這樣,而不能BiTree *T來作為形參。

使用dev c++編譯,這個問題不知道該怎麼解決。

 

 

最近又有了新的發現,正常的程式在定義結構體時都是這麼定義的:

typedef struct qnode{<br />bitree data;<br />struct qnode *next;<br />}qnode,*queueptr;<br />typedef struct{<br />queueptr front;<br />queueptr rear;<br />}linkqueue;</p><p>//在定義新的結構體數組時總是習慣用那個*queueptr來定義,作為函數參數的時候也是這樣用的<br />int initqueue(linkqueue &q)<br />我覺得問題應該出在這裡

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.