-
22-04-2012, 01:45 PM #1Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
lấy phần tử trong danh sách liên kết
có ai giải thích cách lấy phần tử đầu hoặc cuối hay giữa trong danh sách liên kết đơn giúp mình ko [IMG]images/smilies/Cry.gif[/IMG]
View more random threads:
- Viết chương trình chỉnh hợp và tổ hợp trong lập trình C
- các anh giúp em bài switch này với <<
- Bài toán tạo biểu thức (rất khó giúp mình với)
- Hỏi 1 chút về cấu trúc lồng nhau
- thắc mắc về visual c++ 6.0
- Kiểm tra xem các chữ số của số nguyên dương n có giảm dần/ tăng dần từ trái sang phải không.
- Xóa phần tử trong mảng với 1 điều kiện nào đó.
- Tối ưu code
- Cài Đặt Stack
- các bác giúp em với, em làm sai chỗ nào rồi
-
22-04-2012, 02:05 PM #2Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Bạn xây dựng danh sách đơn thế nào? Code đâu post câu hỏi không thế này à? Có chúa mới biết được.
Nếu bạn xây dựng 1 node như sau:
Mã:typedef struct _Node{ int data; _Node *next;}Node;
Duyệt danh sách theo kiểu node = node->next, đến khi nào node->next == NULL (nhớ gán lúc thêm node mới) thì node đó là phần tử cuối cùng.
-
22-04-2012, 02:22 PM #3Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
mình có làm bài tính biểu thức hậu tố bằng danh sách liên kết dựa trên bài cũ làm bằng stack nhưng mà tới cái đoạn lấy phần tử đầu thì bí ko biết lấy ra sao nên ko dám up code lên cho mọi người xem tại ocde ko hoàn chỉnh mà [IMG]images/smilies/21.gif[/IMG]
code chưa hoàn chỉnh có nhiu mình up nhiu thôi
Mã:typedef struct node { float S[50]; int infor; int top; struct node *next; }*NODEPTR; // toán tử int LaToanTu(char c) { if((c=='+')||(c=='-')||(c=='*')||(c=='/')||(c=='^')) return 1; else return 0; } //thêm ký tự char *ThemKyTu (char *p, char c) { int DoDai; DoDai=strlen(p); p[DoDai]=c; p[DoDai+1]='\0'; return p; } // tạo danh sách void initialize ( NODEPTR *plist) { *plist = NULL; } //cấp pháp bộ nhớ 1 node NODEPTR getnode (void) { NODEPTR p; p = (NODEPTR) malloc(sizeof( struct node)); return(p); } // giải phóng 1 node void freenode ( NODEPTR p) { free(p); } // kiểm tra danh sách int emptynode (NODEPTR *plist) { if ( *plist == NULL ) { return (TRUE); } return (FALSE); } // thêm phần tử vào đầu danh sách void push_top ( NODEPTR *plist , int x) { NODEPTR p; p = getnode(); p-> infor = x; p->next = *plist; *plist = p; } void pop_top(NODEPTR *plist,float x) { // phần lấy phần tử đầu mình bí } // thêm phần tử vào cuối danh sách void push_bottom ( NODEPTR *plist , int x) { NODEPTR p,q; p = getnode(); p->infor = x; q = *plist; while ( q->next !=NULL) q = q->next; q-> next = p; p ->next = NULL; } float tinhHT ( char *p) { NODEPTR plist; initialize(&plist); int dodai; float so , so1 , so2 , tong; int i ; char Tam[MAX]; dodai = strlen(p); Tam[0] = '\0'; for ( i = 0 ; i < dodai ; i++) { if(p[i] == ' ') { if(Tam[0] != '\0') { so = atoi(Tam); push_top(&plist , so); Tam[0] = '\0'; } } else { if(LaToanTu(p[i])) { if(Tam[0] != '\0') { so = atoi(Tam); push_top(&plist , so); Tam[0] = '\0'; } pop_top(&plist , so2); pop_top(&plist , so1); switch(p[i]) { case '+': tong = so1 + so2; break; case '-': tong = so1 - so2; break; case '*': tong = so1 * so2; break; case '/': tong = so1 / so2; break; case '^': tong = pow(so1,so2); break; } push_top(&plist , tong); } else ThemKyTu(Tam , p[i]); } } pop_top(&plist , tong); printf("Ket qua:"); printf("&.2f",tong); return tong; }
-
22-04-2012, 03:52 PM #4Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
có ai giúp mình ko [IMG]images/smilies/Cry.gif[/IMG]
-
22-04-2012, 04:41 PM #5Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Mình giả sử code bạn đúng hết [IMG]images/smilies/biggrin.png[/IMG] , thêm pop_top nữa là xong
Mã:void pop_top(NODEPTR plist)//dùng con trỏ cấp 1 cho đơn giản, ko cần thiết dùng con trỏ cấp 2 { if(plist!=NULL) { plist = plist->next; } }
-
22-04-2012, 04:41 PM #6Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Sửa cho bác cách cài đặt stack dùng danh sách liên kết đơn. Còn code và thuật toán của bác tính biểu thức hậu tố. Tôi góp ý là nên xem lại đi. Code quá tệ, nhìn rối mù. :-|
Mã:typedef struct _Node { float data; struct _Node *next;}Node, *PNode;//cấp pháp bộ nhớ 1 nodePNode newNode(){ return (PNode)malloc(sizeof(Node));}// giải phóng 1 nodevoid deleteNode (PNode lpNode){ free(lpNode);}// kiểm tra danh sách int isEmpty(PNode list){ return (list == NULL);}// thêm phần tử vào đầu danh sáchvoid push_top(PNode *list, float data){ PNode node = newNode(); node->data = data; node->next = *list; *list = node;}// thêm phần tử vào cuối danh sáchvoid push_bottom(PNode *list, float data){ if(list) { PNode last = NULL; for(last = *list; last->next != NULL; last = last->next); last->next = newNode(); last->next->data = data; } else { *list = newNode(); (*list)->data = data; }}float pop_top(PNode *list){ PNode top = *list; float data = top->data; *list = top->next; deleteNode(top); return data;}// toán tửint isOperator(char c){ return ( (c=='+') || (c == '-') || (c=='*') || (c=='/') || (c=='^'));}//thêm ký tựchar *ThemKyTu (char *p, char c){ int DoDai; DoDai = strlen(p); p[DoDai]=c; p[DoDai + 1]='\0'; return p;} float tinhHT (char *p){ PNode list = NULL; int dodai; float so , so1 , so2 , tong; int i ; char Tam[256]; dodai = strlen(p); Tam[0] = '\0'; for (int i = 0 ; i < dodai; ++i) { if(p[i] == ' ') { if(Tam[0] != '\0') { so = atoi(Tam); push_top(&list , so); Tam[0] = '\0'; } } else { if(isOperator(p[i])) { if(Tam[0] != '\0') { so = atoi(Tam); push_top(&list, so); Tam[0] = '\0'; } so2 = pop_top(&list); so1 = pop_top(&list); switch(p[i]) { case '+': tong = so1 + so2; break; case '-': tong = so1 - so2; break; case '*': tong = so1 * so2; break; case '/': tong = so1 / so2; break; case '^': tong = pow(so1,so2); break; } push_top(&list , tong); } else ThemKyTu(Tam , p[i]); } } tong = pop_top(&list); printf("Ket qua:"); printf("&.2f",tong); return tong;}
-
22-04-2012, 04:44 PM #7Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
hix cảm ơn bác học cái này chưa vững nữa nên thiếu sai sót tùm lum
-
22-04-2012, 05:26 PM #8Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
bác ơi đoạn
Mã:float data = top->data;
hay do mình chưa tạo cái deletenode ?
-
22-04-2012, 05:28 PM #9Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi yokashi
Nếu có lỗi thì tôi nghĩ là do code của bác, có kiểm tra isEmpty() trước khi top_pop() không?
-
22-04-2012, 05:38 PM #10Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi doicanhden
Ngoại trừ một số ít trường hợp rãnh mũi - má và “râu rồng silicon” xuất hiện sớm, có khi từ tuổi thanh niên do cơ địa, còn lại, đại đa số do căn do lão hoá đã gây nên ba diễn biến: Giảm mô xương gò...
Cách thẩm mỹ má ở tuổi trung niên...