-
17-05-2014, 03:44 PM #1
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Ở đây bạn có con trỏ *ds là phần tử đầu tiên của danh sách, còn phần tử cuối của danh sách trỏ tới NULL. Khi ấy thì làm các câu e, g bạn phải viết hàm khác chứ không sử dụng được các hàm cơ bản như chèn nút mới vào sau một phần tử hoặc xóa một nút ngay sau nút đang xét.
Với các bài toán về danh sách liên kết, mình thường sử dụng cấu trúc bao gồm 2 con trỏ làm mốc là first và last, với first trỏ tới phần tử đầu tiên của danh sách, còn last được phần tử cuối của danh sách trỏ tới, và cả 2 con trỏ này đều không có trường giá trị. Với cấu trúc đó, ví dụ bạn muốn làm câu e thì bạn không cần phải viết hàm insert_to_head hay delete_head gì cả, bạn chỉ cần dùng 2 hàm chèn nút mới vào sau một phần tử hoặc xóa một nút ngay sau nút đang xét để xử lý.
Bây giờ với 2 hàm chèn nút mới vào sau một phần tử (mình gọi là insert(node *t, key x)) và xóa một nút ngay sau nút đang xét (mình gọi là delete(node *t)), mình sẽ đưa ra hướng giải các bài toán của bạn.
Đây là hình minh họa cho cấu trúc của mình (trong ảnh thì head ~ first, và z ~ last của mình)
a. Xóa các số chẵn -> Bạn duyệt từ nút first, nếu thấy nút nào mà sau nó là một số chẵn, thì gọi hàm delete(t) để xóa nút sau nó đến khi nút sau nó mang giá trị lẻ.
b. Sắp xếp tăng, giảm dần -> Câu này mình thấy bạn đã làm được.
c. Thêm số vào cuối danh sách -> Bạn duyệt từ đầu danh sách, đến khi một nút trỏ tới nút last thì dừng lại, sau đó gọi hàm insert để chèn vào sau nó.
d. Xóa các số nguyên tố, các số không phải là nguyên tố -> Tương tự như câu a
e. Xóa, thêm phần tử đầu tiên -> Bạn chỉ cần gọi hàm delete(first) hoặc insert(first, x) là xong
f. Xóa các số lẻ -> Tương tự câu a
g. Xóa 2 phần tử đầu tiên. -> Bạn gọi delete(first) 2 lần là xong
ps: Cấu trúc dữ liệu trên mình tham khảo trong sách Algorithms in C của Robert Sedgewick, bạn có thể tìm đọc để hiểu rõ ràng hơn!View more random threads:
- \t trong c++
- [Solved]hỏi về struct ( sai chỗ nào đây nhỉ)
- Gặp khó khăn với việc xuống dòng trong file
- Thắc mắc về một số vấn đề cơ bản trong C
- Giải thuật song song cho bài toán quy hoạch động và quay lui
- Bài toán về danh sách Sinh Viên.
- Tìm phần tử nguyên tố đầu tiên trong mảng
- Các bác xem giúp em làm sao mà cứ đến lúc nhập A[0][0] là bị lối runtime?????
- giải thích giúp đoạn code trong bài lũy thừa
- cách in ra cánh quạt bằng ký tự *
-
17-05-2014, 07:32 PM #2
Silver member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
sử dụng danh sách móc nối tạo n số ngầu nhiên cho danh sách liên kết
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h> (thư viện khai báo thời gian)
typedef
struct pointer( dữ liệu kiểi cấu trúc)
{ int so;
struct pointer *next;
}
pointer;
int random(int num)
{
return (int)(((long)rand()*num)/(RAND_MAX+1));
}
( srand(time(NULL)); //dòng này để tạo giá trị seed ngẫu nhiên
rand(); //dòng này sẽ cho ra một số nguyên ngẫu nhiên từ 0 đến RAND_MAX (được định nghĩa trong file stdlib.h} )
int main()
{int i,k,tg,n;
pointer *ds, *p, *z;( con trỏ )
printf("
Nhap so phan tu n = ");
scanf("%d",&n);
ds=NULL;
srand(time(NULL));
for (i=1;i<=n;i++)
{
k=random(100);
p = (pointer *)malloc(sizeof(pointer)); (malloc cấp phát bộ nhớ động)
p->so = k;
p->next=ds;
ds=p;
}
printf("Danh sach lien ket DUOC TAO RA
");
for (p=ds;p;p=p->next)
printf("%5d",p->so);
for (p=ds;p->next;p=p->next)
for (z=p->next;z;z=z->next)
if (p->so > z->so)
{
tg = p->so;
p->so = z->so;
z->so = tg;
};
printf("
Danh sach lien ket SAU KHI sap sep
");
for (p=ds;p;p=p->next)
printf("%5d",p->so);
getch();
}
Mọi người giúp mình code cho phần danh sách móc nối này ạ:
a. Xóa các số chẵn
b. Sắp xếp tăng, giảm dần
c. Thêm số vào cuối danh sách
d. Xóa các số nguyên tố, các số không phải là nguyên tố
e. Xóa, thêm phần tử đầu tiên
f. Xóa các số lẻ
g. Xóa 2 phần tử đầu tiên.
Mình mới học và sắp kiểm tra. Cảm ơn mọi người!
-
18-05-2014, 11:32 AM #3
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Như câu d, câu f bạn chỉ cần thay đổi biểu thức điều kiện trong vòng while thôi: ở câu a thì là t->next->inf % 2 == 0 (số chẵn) thì bạn thay bằng nguyento(t->next->inf) == 1 (là số nguyên tố) hoặc t->next->inf % 2 == 1 (số lẻ). Hàm số nguyên tố thì bạn có thể tự viết hoặc search trên mạng, cái này có rất nhiều.
Còn câu g thì bạn làm giống hệt câu e, chỉ có điều là bạn gọi DeleteNext(first) hai lần thay vì một lần như ở câu e.
Chỉ có vậy thôi, rất đơn giản!
-
18-05-2014, 04:10 PM #4
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Mình hi vọng bạn chèn luôn giúp mình từng câu! tạm hiểu vậy mình sẽ hỏi thêm! Sắp thi nên sẽ cố gắng nhập dần! bạn chèn giúp mình vs nhé! rất cảm ơn! làm giúp mình câu a, c, d, e phần xóa, f, g nhé cảm ơn ạ!
- - - Nội dung đã được cập nhật ngày 18-05-2014 lúc 09:10 AM - - -
à đây là mình dùng trong C thôi nhé! chưa học C++ nên chưa rõ dc cảm ơn bạn! bạn chèn giúp mình code!
-
18-05-2014, 04:54 PM #5
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
cảm ơn bạn nhiều!
-
18-05-2014, 05:04 PM #6
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Mình làm các câu a, c, e cho bạn rồi, các câu d, f, g thì hoàn toàn tương tự thôi (câu d và f giống hệt câu a, chỉ khác biểu thức kiểm tra điều kiện)
Hi vọng giúp được bạn!
Mã:#include<stdio.h>#include<stdlib.h>#include<time.h> #define MAX 100 /* Giá trị lớn nhất của phần tử trong danh sách là 100 */ typedef int ElementType; /* Kiểu dữ liệu của phần tử trong danh sách là int */struct node /* Cấu trúc dữ liệu danh sách */{ ElementType inf; struct node *next;}; struct node *first, *last, *t; /* first và last là 2 con trỏ làm mốc */ void ListInit() /* Khởi tạo danh sách */{ first = (struct node *) malloc(sizeof *first); last = (struct node *) malloc(sizeof *last); first->next = last; last->next = last;} int DeleteNext(struct node *t) /* Xóa nút ngay sau nút t */{ struct node *temp = t->next; t->next = t->next->next; free(temp);} struct node *InsertAfter(ElementType v, struct node *t) /* Chèn một nút mới có giá trị v vào sau nút t */{ struct node *x; x = (struct node *) malloc(sizeof *x); x->inf = v; x->next = t->next; t->next = x; return x; } void PrintList(struct node *head) /* In ra danh sách */{ struct node *p; p = head->next; while (p != last) { printf("%d ", p->inf); p = p->next; }} int main(){ srand(time(NULL)); ListInit(); /* Tao danh sach n nut co gia tri ngau nhien */ int n; printf("n = "); scanf("%d", &n); t = first; for (int i = 0; i <= n; i++) t = InsertAfter(rand() % MAX + 1, t); /* a. Xoa cac so chan (cau d. va cau f. lam tuong tu) */ for (t = first; t != last; t = t->next) { while (t->next->inf % 2 == 0) /* Neu sau t la mot so chan */ DeleteNext(t); } /* c. Them so vao cuoi danh sach */ for (t = first; t != last; t = t->next) ; /* Tim nut cuoi danh sach */ t = InsertAfter(rand() % MAX + 1, t); /* Chen nut moi vao sau nut cuoi */ /* e. Xoa phan tu dau tien, cau f. lam tuong tu */ DeleteNext(first); /* e. Them phan tu moi vao sau phan tu dau tien */ t = InsertAfter(rand() % MAX + 1, first); return 0;}
-
18-05-2014, 05:46 PM #7
Junior Member
- Ngày tham gia
- Sep 2015
- Đang ở
- hà nội
- Bài viết
- 0
Bạn có thể làm tiếp dc ko ạ? cái này mới với mình nên muốn cặn kẽ chi tiết một chút! cảm ơn ạ![IMG]images/smilies/kiss.gif[/IMG]
- - - Nội dung đã được cập nhật ngày 18-05-2014 lúc 10:46 AM - - -
cảm ơn bạn đã giúp mình! hj vọng đọc kĩ sẽ rõ ràng
-
19-05-2014, 05:51 PM #8
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
cho mình dòng insertafter là như thế nào? mình viết nó báo lỗi dòng này
-
20-05-2014, 12:35 PM #9
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Vậy à, bạn có thể cho mình xem chương trình và hình ảnh thông báo lỗi được không?
-
20-05-2014, 03:48 PM #10
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
mình dùng codeblock 13.12 chỉ nhập n r không có gì nữa? không biết là do đâu?
khi đề cập đến đội hình MU, không thể ko nói tới một trong các câu lạc bộ bóng đá huyền thoại và với tầm ảnh hưởng nhất trong lịch sử của môn thể thao vua. Với hơn 1 thế kỷ còn đó và phát triển,...
Đội hình MU - Manchester United:...