bạn nói yêu cầu với sửa cái jif chứ
Mong các bạn giúp mình sửa đoạn code này
dưới đây là code với đề bài là tạo lập 1 dãy số nguyên, thêm, xóa 1 số trước vị trí trỏ bởi p:
C Code:
#include<stdio.h> #include<conio.h> #include<stdlib.h> #include<ctype.h> struct node { int x; struct node *next;}pt; typedef struct node *nodeptr; nodeptr first,last; nodeptr new_node(){ nodeptr p; return(p); } void insert_first(nodeptr &first,int y) { nodeptr p; p=new_node(); p->x=y; p->next=first; first=p; } void duyet(nodeptr first) { nodeptr p; p=first; if(p==NULL) while(p!=NULL) p=p->next; } } void insert_before(nodeptr p,nodeptr first,int y) { nodeptr q,q1; if(p==first) insert_first(first,y); else { q=new_node(); q->x=y; q->next=p; q1=first; while(q1->next!=p){ q1=q1->next;q1->next=q;} } } void del_before(nodeptr p,nodeptr first) { nodeptr q; if(p==first) first=first->next; else { q=first; while(q->next!=p) q=q->next; q->next=p->next; } } void khoitao(nodeptr &first) {first=NULL;} void nhap() { int ra=1,x; char c; FILE *fp; khoitao(first); while(ra) { insert_first(first,x); } } void main() {nodeptr p; khoitao(first); int thoat=1,n,x; while(thoat) clrscr(); switch(n){ case 1:nhap();break; case 5: thoat=0;break; }}}
*Chú ý: Bỏ code vào tag code, xem hướng dẫn ở đây
Đã được chỉnh sửa lần cuối bởi QuangHoang : 13-10-2008 lúc 02:27 PM. Lý do: Bổ xung phần còn thiếu nhưng vẫn chưa hoàn chỉnh
bạn nói yêu cầu với sửa cái jif chứ
giờ say mê bên ai em đổ lỗi anh vô tình
Đoạn code trên của mình bị lỗi vòng lặp vô tận ở trong insert_before và del_before. Mình đã thử sửa nhiều lần nhưng không thành công. Mong các bạn giúp mình với!!!!!!!!!!
C++ Code:
while(q1->next!=p){ q1=q1->next;q1->next=q;}
Bạn xem lại chổ này nhé.
tại sao q1->next = q; vậy đây là bạn đang tìm kiếm đến node p mà.
đề nghị bỏ đi câu lệnh q1->next = q; ra ngoài vòng lặp
C++ Code:
while(q1->next!=p){ q1=q1->next; } nodeptr tmp; tmp = q1->next; // lưu lại con trỏ sau của tmp q1->next=q; q->next = tmp; // gán lại q->next bằng tmp để không bị mất đoạn về sau .
ps: chẳng thấy bạn giải phóng bộ nhớ ở đâu cả
Chào bạn, bạn nên chú ý một điều, ở thân hàm main bạn khai báo p như vậy nó sẽ chỉ đến một giá trị bất kì, vì thế tất nhiên sẽ sai và lặp vô hạn khi bạn dùng vòng lặp để search trong danh sách dù là để trong hàm bất kì nào.
Vậy trước tiên là lỗi ở đó nhé. Sửa lỗi này như nào, bạn khởi gán p=NULL khi khai báo, nhưng để test đúng sai của hàm insert và delete thì bạn cần viết một hàm nữa là tìm một giá trị trong chuỗi trả về con trỏ node tại vị trí tìm thấy, dùng kết quả hàm đó để gán cho p, rồi test đúng sai cho 2 hàm kia. Có mệt chút nhưng như thế mới khá nhanh được.
Về bài trên thì hàm insert có vấn đề Zkday đã sửa giúp bạn rồi thì phải.
Chúc bạn học tốt!
Cảm ơn hai bạn đã nhiệt tình giúp mình! Những lỗi trên mình đã sửa được rồi.
Nhưng mình thấy code trên còn cồng kềnh! Không biết có thể tinh chỉnh cho đơn giản hơn không???
pro wa đây chính là vấn đề mình đang trăn trở lâu nay !!! đó là khả năng self-referential struct !!! nhưng mấy việc creat display insert remove thi đơn giản rồi !!! vì khi remove và insert có 1 target để thêm và bớt (tức là thêm và bớt trước 1 point đã được xác định tên ) !!! vấn đề còn lại là sắp xếp thì sao ???
khi mình giải bài này có hơi khác so với bạn Trần Cường 1 chút đó là struct của mình bao gồm { name ,age ,next} vấn đề còn lại là sắp xếp theo tên theo bảng chữ cái !!! nếu tên trùng nhau thì sắp theo tuổi !!!!
Nhiều lần Solve mà ko xong !!! bạn nào giúp mình với !!!
Thêm 1 chút nữa cho hỏi chủ topic có phải Nguyễn Trần Cường (PFIEV hut K51) không nhỉ !!! khì khì
Cuối cùng cũng xong phần sắp xếp rùi !!! hì hì !!!
hàm trên xác định vị trí 1 điểm trong nút giờ việc sắp xếp không khác gì các phần tử của mảng bình thường rồiCode:node *locate(node *head,char a[30]){ if(!strcmp(head->next->name,a)){ return (head);} else if(head->next->next ==NULL){ return NULL;} else { locate(head->next,a); } }
so sánh phần tử 1 so với các phần tử 2 3 4 ... đến cuối dãy
rồi so sánh 2 với 3 4 ... đến cuối dãy
dùng hàm strcmp() để so sánh 2 tên và đổi chỗ thì làm như sau
đặt vị trí đang đứng bằng temp còn tag1 là nút trước temp , tag2 là vị trí bất kì trước nút được so sánh
tag1 = locate(head,temp->name);
tag2=locate(head,node->name);
trong đó node là 1 vị trí bất kì kể từ phần tử được xét đến cuối danh sách
mô hình như sau
tag1->temp->next1
tag2->node->next2
giờ phải đổi chỗ temp và node
tag1->next=node;
node->next=next1;
tag2->next=temp;
temp->next=next2;
(việc đổi chỗ dùng khá nhiều biến trung gian ... nhưng có lẽ chi tiết như thế dễ hiểu hơn ...hi hi)
ngoài ra mình có đọc được người ta sắp xếp Danh Sách Móc Nối này bằng phương pháp trộn ( đọc 1 thôi 1 hồi cuối cùng chẳng hiểu nhiều lắm )
Đã được chỉnh sửa lần cuối bởi ledinhtung61 : 05-01-2009 lúc 11:27 AM.