Re: [問題] generalized list廣義串列跑不出結果

看板C_and_CPP作者 (喲)時間11年前 (2012/11/09 01:53), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/3 (看更多)
※ 引述《yauhh (喲)》之銘言: : ※ 引述《supercygnus (......)》之銘言: : : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : : DEV C++ : : 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) : : 問題(Question): : : 廣義串列建好之後,想把第一個節點的字元印出來可是結果不正確,很怪 : : 到底哪裏出問題啊~? 還有要怎麼列出整個串列呢~?? 熬夜陪君子。要伸程式就給你也沒關係, http://codepad.org/K5qBSiCc (為了方便保存,文末再貼一次源碼) 不過建議在偷看答案或參考範例之前先確定自己已經盡心盡力了,才不會浪費 之前思考的時間. 開發平台: g++ 執行方式是編譯之後,在console中敲指令如下 (Linux環境給參數要加escape符號) ./genlist \(a,\ b,\ \(c\)\) 印出[r([d(a)[d(b)[r([d(c)])]]])] ./genlist \(\(a,\ \ b\),\ c,\ \(d\)\) 印出[r([r([d(a)[d(b)]])[d(c)[r([d(d)])]]])] 感想是太爽了,寫了一個Lisp parser,真好玩。 : : 餵入的資料(Input): : : (a,b,(g)) : : 預期的正確結果(Expected Output): : : a : : 錯誤結果(Wrong Output): : : 程式碼(Code):(請善用置底文網頁, 記得排版) : : http://ideone.com/RPmF4e : 你程式有些地方,看不懂你做了什麼. 像12-15行, : union{ : char data; : ListNode *dlink; : }; : 說data和下一個節點的連結是同一個東西. 我想你應該不會這樣用吧. : 但一看92行 : p->data=x-48; : 然後100行 : q=p->dlink; : 然後 : free(p); : return q; : 你拿到的q是個什麼東西? -----源碼----- #include<iostream> struct ListNode; ListNode* get_list_node(); void init(struct Stack*&); void push(Stack*&, ListNode*); ListNode* pop(Stack*&); bool is_empty(Stack*); struct Stack { ListNode* s[1024]; int top; }; struct ListNode { ListNode *next; bool is_set; bool is_ref; union { char data; ListNode *ref; }; }; ListNode* genlist(std::string str) { int i; ListNode *p; Stack *s = new Stack(); ListNode *result = get_list_node(); p = result; p->is_ref = true; for (i=0; i<str.length(); i++) { switch(str[i]) { case '(': p->is_ref = true; p->ref = get_list_node(); push(s, p); p = p->ref; break; case ')': p = pop(s); continue; case ',': p->next = get_list_node(); p = p->next; break; case ' ': break; default: if (p->is_set) std::cout << "Parsing Error: Expression may be ill-formated." << std::endl; p->is_ref = false; p->data = str[i]; p->is_set = true; break;; } } if (is_empty(s)) std::cout << "Parsing Error: Expression may be incomplete." << std::endl; delete s; return result; } ListNode* get_list_node() { ListNode *result = new ListNode(); result->next = NULL; result->is_set = false; result->is_ref = false; result->ref = NULL; return result; } void list_list(ListNode *node) { if (node != NULL) { std::cout << '['; if (node->is_ref) { std::cout << "r("; list_list(node->ref); } else { std::cout << "d("; std::cout << node->data; } std::cout << ')'; list_list(node->next); std::cout << ']'; } } void init(Stack* &stack) { stack->top = -1; } void push(Stack* &stack, ListNode* node) { stack->top++; stack->s[stack->top] = node; } ListNode* pop(Stack* &stack) { ListNode *result = stack->s[stack->top]; stack->top--; return result; } bool is_empty(Stack *stack) { return (stack->top == -1); } int main(int argc, char* argv[]) { ListNode *list; if (argc < 2) std::cout << "Parameter: a string." << std::endl; else { std::string s = argv[1]; list = genlist(s); list_list(list); std::cout << std::endl; delete list; } return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.167.52.241 ※ 編輯: yauhh 來自: 118.167.52.241 (11/09 01:54)
文章代碼(AID): #1Gc_667v (C_and_CPP)
文章代碼(AID): #1Gc_667v (C_and_CPP)