harryGod
一般會員
發表:16 回覆:19 積分:7 註冊:2004-12-09
發送簡訊給我
|
題目:以struct做2物件stack,之後以linked list方式做堆疊排序
一個數字慢慢輸入 直到輸入-1做停止
譬如:
原本要輸入1324
input:
1
3
2
4
-1
停止
output:
1234 code:
#include
#include
using namespace std;
struct node
{
int data;
node *next;
};
node *push(node *s1,node *s2,int data);
node *push2(node *s2,int data);
node *pop(node *s1,node *s2);
void main()
{
node *s1=NULL,*s2=NULL;
int data;
while(data!=(-1))
{
cin>>data;
s1=push(s1,s2,data);
}
while(s2)
s1=pop(s1,s2);
while(s1)
{
cout<data;
delete s1;
s1=s1->next;
}
system("pause");
}
node *push(node *s1,node *s2,int data)
{
if(data>s1->data)
{
s2=push2(s2,s2->data);
s1->data=data;
return s1;
}
else
{
node *link=new node;
link->data=data;
link->next=s1;
s1=link;
return s1;
}
}
node *push2(node *s2,int data)
{
node *link=new node;
link->data=data;
link->next=s2;
s2=link;
return s2;
}
node *pop(node *s1,node *s2)
{
node *link=new node;
link->data=s2->data;
delete s2;
s2=s2->next;
return s2;
} 麻煩好心人 幫幫忙@@ 發表人 - harryGod 於 2005/03/12 12:38:09
|
暗黑破壞神
版主
發表:9 回覆:2301 積分:1627 註冊:2004-10-04
發送簡訊給我
|
1.你的問題是什麼?
它在那邊出錯?
在COMPILER期還是在執行期?
2.問問題時要把問題點出來。超過十行的程式要大家幫你慢慢追嗎?
還是你點出你的問題在那邊。讓大家比較快幫你比較合適呢?
|
harryGod
一般會員
發表:16 回覆:19 積分:7 註冊:2004-12-09
發送簡訊給我
|
我的程式 可以RUN 但是按第一個數字就出錯了
DEBUG後他的游標指向if(data>s1->data)位址好像有問題
還有譬如我一個個輸入1324 push進第一個堆疊後
如果輸入第二個數字進堆疊,第二個數字比原先那一個還大
原先那個則push進第二個堆疊
譬如
NULL
s1
NULL
s2 input 1
NULL<- 1
s1
NULL
s2
input 3
NULL<- 3
s1
NULL<- 1
s2
input 2
NULL<- 3 <- 2
s1
NULL<- 1
s2
input 4
NULL<- 4
s1
NULL<- 1 <- 2 <- 3
s2
最後合併 先把s2pop至s1
NULL<- 4 <- 3 <- 2 <- 1
最後再pop s1
就得到答案 output 1234
在pop合併的過程以及判斷是否要push至s2的過程
小弟寫的不太好 麻煩給些建議 謝謝
|
psl
一般會員
發表:6 回覆:30 積分:7 註冊:2003-06-11
發送簡訊給我
|
if( data > s1->data )
這行之所以會出問題
錯誤訊息是提示 Access Violation (我看到的 ^_^)
很明顯的...
你在使用 s1 這個指標時...沒先確定是否為有效的指標啊
第一次用的時候...根本還沒配置好記憶體 s1 = NULL 有用到指標的時候要多注意喔
你先檢查看看...順便自己改一下吧
|
psl
一般會員
發表:6 回覆:30 積分:7 註冊:2003-06-11
發送簡訊給我
|
harryGod 你好
以下為做法之一...
用一個堆疊就可以達到你要的結果
如果要用兩個堆疊實作
說真的...我看不懂你的意思 ^_^!
排序是簡單的泡泡排序法...其他排序法翻書或上網都查的到
剩下的你就自己努力吧...加油囉
#include
using namespace std; const int MAX_ITEM = 20; typedef struct stk
{
int item[MAX_ITEM]; /*資料欄位*/
int top;
}STACK; int is_empty(STACK *S)
{
if(S->top == -1)
return(1);
else
return(0);
} int is_full(STACK *S)
{
if (S->top == (MAX_ITEM-1))
return(1);
else
return(0);
} void PrintStack(STACK *s)
{
if ( is_empty(s) )
return;
for (int i=s->top; i >= 0; i--)
cout << s->item[i] << " ";
cout << endl;
} int PUSH(STACK *S, int X)
{
if(is_full(S))
return(0); S->top = S->top 1;
S->item[S->top] = X;
return(1);
} int POP(STACK *S,int *X)
{
if(is_empty(S))
return (0); *X = S->item[S->top];
S->top--;
return(1);
} void BubbleSort(STACK *s)
{
if (s->top == 0) // only one integer in the stack
return; for( int i=0; itop; i )
{
for( int j=i 1; j<=s->top; j )
{
if (s->item[i] > s->item[j])
{
int temp = s->item[j];
s->item[j] = s->item[i];
s->item[i] = temp;
}
}
}
} int main(void)
{
STACK S;
int input=0, LoopFlag=1;
char Sort; S.top = -1; cout << " 請輸入大於零的整數, 或是以 <0> 結束輸入 " << endl;
while( LoopFlag )
{
cin >> input;
if (input == 0)
LoopFlag=0;
else
{
if( PUSH(&S, input) == 0 )
cout << "堆疊已滿,PUSH失敗" << endl;
}
} cout << " 原始堆疊由上到下為: ";
PrintStack(&S); cout << " 排序堆疊? : ";
cin >> Sort; if ( Sort=='Y' || Sort=='y' )
{
BubbleSort(&S);
cout << " 排序後的堆疊由上到下為: ";
PrintStack(&S);
}
system("pause");
return 0;
}
|