01/10/2018, 16:29

Bài tập về linked list

mình vẫn đang hơi mơ hồ về list struct nên chắc vì thế mình làm mãi cũng không nghĩ ra được cách làm cho bài này. Mình đọc khá nhiều tài liệu về list struct rồi, có cảm giác rất hiệu nhưng ứng dụng vào bài tập thì lại tịt. buồn quá!

Chả là mình có một struct như sau

struct member {
   int number; //ma so nhan vien
   char name[50]; //ten nhan vien
   sturct member *next;
};
struct member *allocBox(int number, char *name, struct member *tail); //struct de nhap ma so nhan vien va ten nhan vien
void display_all(struct member *head); //sau khi dang ki xong thi hien thi toan bo nhan vien len

mục tiêu là sau khi nhập ‘quit’ thì mới ngừng nhập tên nhân viên và khi hiển thị thì sẽ hiển thì theo số ‘number’ thứ tự đã nhập.
//------------------------------------------------------------------------------
trong cái struct member thì sẽ phân ra và nhét vào địa chỉ new_pt
sau đó chuyển sang cho tail->next =new_pt tới khi kết thúc chương trình thì sẽ return về new_pt
//-----------------------------------------------------------------------------
còn cái void display_all này thì nó sẽ hiển thị toàn bộ nội dung đã nhập từ head tới cuối vào giữa struct member. Nghĩa là có thể viết là display_all(head) hoặc display_all(head->next) cũng được.
//------------------------------------------------------------------------------
đại khái nó sẽ có dạng như thế này

struct member *HEAD, *TAIL;

int main(void) {
        int i;
        char name[50];
        HEAD = TAIL = NULL;
        do {
                printf("Input name > ");
                scanf("%s", name);
                if (strcmp(name, "quit") != 0) {
                        TAIL = allocBox(i, name, TAIL);
                        if (HEAD == NULL) HEAD = TAIL;
                        i++;
                }
        }while(strcmp(name, "quit")!=0);
       .....
       return 0;
}

ông thầy chỉ gợi ý tới chỗ này thôi mà thứ 6 phải nộp rồi mà mình vẫn chưa nghĩ ra được cách làm, bạn nào có lòng hảo tâm giúp mình với
//----------------------------------------------------------
À mình đã làm được rồi. Cảm ơn mọi người đã giúp đỡ. Mình đăng lên đây cho mọi người tham khảo, tiện thể kiểm tra hộ mình xem code của mình đã đúng chưa, có cần sửa đoạn nào thì nó sẽ phù hợp hơn không?

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct member{
  int number;
  char name[50];
  struct member *next;
};

struct member *allocBox(struct member *temp, struct member *tail);
void display_all(struct member *head);

struct member *HEAD, *TAIL;

int main(){
  struct member num;
  int i=1;
  char name[50];
  HEAD = TAIL = NULL;
  for(;;i++){
    printf("Input name >");
    scanf("%s",num.name);
    if(strcmp(num.name,"quit") == 0) break;
    num.number = i;
    TAIL = allocBox(&num,TAIL);
    if(HEAD == NULL) HEAD = TAIL;
  }
  display_all(HEAD);
  printf("quit the list
");
  return 0;
}

struct member *allocBox(struct member *temp, struct member *tail){
  struct member *new_pt;
  
  new_pt = (struct member*)malloc(sizeof(struct member));
  if(new_pt == NULL){
    fprintf(stderr, "malloc error, %s
",temp->name);
    exit(1);
  }
  strcpy(new_pt->name, temp->name);
  new_pt->number = temp->number;
  new_pt->next = NULL;
  if(tail != NULL) tail->next = new_pt;
  return new_pt;
}

void display_all(struct member *head){
  if(head == NULL) return;
  return printf("%d %s
",head->number, head->name), display_all(head->next);
}

Nguyen Hieu viết 18:43 ngày 01/10/2018

Ở hàm struct member *allocBox(int number, char *name, struct member *tail) bạn tạo con trỏ kiểu member rồi truyền giá trị vào (nhớ cấp phát bộ nhớ cho con trỏ), gán tail->next =new_pt rồi return new_pt.
Mà có phải bạn đang làm về linked list không? chứ struct list mình nghe lần đầu

nya nguyen viết 18:41 ngày 01/10/2018

ừ đúng rồi đó bạn. Mình chưa quen thuật ngữ nên cứ gọi theo cảm tính =))
Cái chỗ … dưới while kia bạn có biết mình nên điền cái gì vào không?

nya nguyen viết 18:41 ngày 01/10/2018

À mình đã làm được rồi. Cảm ơn mọi người đã giúp đỡ. Mình đăng lên đây cho mọi người tham khảo, tiện thể kiểm tra hộ mình xem code của mình đã đúng chưa, có cần sửa đoạn nào thì nó sẽ phù hợp hơn không?

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct member{
  int number;
  char name[50];
  struct member *next;
};

struct member *allocBox(struct member *temp, struct member *tail);
void display_all(struct member *head);

struct member *HEAD, *TAIL;

int main(){
  struct member num;
  int i=1;
  char name[50];
  HEAD = TAIL = NULL;
  for(;;i++){
    printf("Input name >");
    scanf("%s",num.name);
    if(strcmp(num.name,"quit") == 0) break;
    num.number = i;
    TAIL = allocBox(&num,TAIL);
    if(HEAD == NULL) HEAD = TAIL;
  }
  display_all(HEAD);
  printf("quit the list\n");
  return 0;
}

struct member *allocBox(struct member *temp, struct member *tail){
  struct member *new_pt;
  
  new_pt = (struct member*)malloc(sizeof(struct member));
  if(new_pt == NULL){
    fprintf(stderr, "malloc error, %s\n",temp->name);
    exit(1);
  }
  strcpy(new_pt->name, temp->name);
  new_pt->number = temp->number;
  new_pt->next = NULL;
  if(tail != NULL) tail->next = new_pt;
  return new_pt;
}

void display_all(struct member *head){
  if(head == NULL) return;
  return printf("%d %s\n",head->number, head->name), display_all(head->next);
}

Nguyen Hieu viết 18:45 ngày 01/10/2018

Ở hàm display_all bạn nên tạo một con trỏ trỏ tới head, như vậy thì sau này muốn truy cập lại còn được chứ head->next thế kia nhỡ cần xử lý thứ khác làm sao được, cũng không cần đệ quy đâu, một vòng while là được rồi.

Bài liên quan
0