Re: [問題] generalized list廣義串列跑不出結果
※ 引述《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)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):