C QueueLinkedList строковая переменная не работает - PullRequest
0 голосов
/ 01 ноября 2019
#include<stdlib.h>

struct customer
{
  int phoneNum;
  char *name;
  struct customer *nxt;
};

struct customer *initialNode(int i, char *n);
int isEmpty(struct customer *head, struct customer *tail);
void enqueue(int phNum1, char *cName1, struct customer *tail);
void dequeue(struct customer *head, struct customer *tail);
void display(struct customer *head, struct customer *tail);

int main()
{
  int phNum;
  char *cName;
  int choice;

  struct customer *head;
  struct customer *tail;
  head = initialNode(0, NULL);
  tail = initialNode(0, NULL);
  head->nxt = tail;
  tail->nxt = head;

  while (choice !=4)
  {
    printf("\nEnter your option:");
    printf("\n1. Enqueue new customer. \n2. Dequeue customer. \n3. Display customer in queue. \n4. Exit. \nOption: ");
    scanf("%d", &choice);

    switch(choice)
    {
      case 1: 
      {
        printf("\nEnter customer phone number: ");
        scanf("%d", &phNum);
        printf("\nEnter customer name: ");
        scanf("%s", cName);
        enqueue(phNum, cName, tail);
        break;
      }
      case 2:
      { 
        dequeue(head, tail);
        break;
      }
      case 3: 
      {
        display(head, tail);
        break;
      }
      default: 
      {
        if (choice < 1 || choice > 4)
          printf("\nInvalid option!\n");
        break;
      }
    }
  }

}

struct customer *initialNode(int i, char *n)
{
  struct customer *newCustomer = malloc(sizeof(struct customer));
  newCustomer->phoneNum = i;
  newCustomer->name = n;
  newCustomer->nxt = NULL;
  return newCustomer; 
}

int isEmpty ( struct customer *head, struct customer *tail)
{
  if (head->nxt == tail)
    return 1;
  else
    return 0;   //cannot is full because it is not array, have no size limitation
}

void enqueue(int phNum1, char *cName1, struct customer *tail)
{
  struct customer *nC = malloc(sizeof(struct customer));
  nC = initialNode(phNum1, cName1);
  nC->nxt = tail;

  tail->nxt->nxt = nC;
  tail->nxt = nC;

  printf("\nSuccessfully enqueue a customer!\n");
}

void dequeue(struct customer *head, struct customer *tail)
{
  struct customer *removedCustomer = malloc(sizeof(struct customer));
  if (isEmpty(head, tail) == 1)
  {
    printf("\nThe queue is empty!\n");
  }
  else
  {
    removedCustomer = head->nxt;
    printf("\nFirst customer is removed.\n");

    head->nxt = head->nxt->nxt;
  }
}

void display(struct customer *head, struct customer *tail)
{
  struct customer *tempH = malloc(sizeof(struct customer));
  tempH = head;
  tempH = tempH->nxt;
  if (isEmpty(head, tail) == 1)
  {
    printf("\nThe queue is empty!\n");
  }
  else
  {
    printf("\n===Current customer list===");
    while (tempH != tail)
    {
      printf("\n\tCustomer phone number : %d", tempH->phoneNum);
      printf("\n\tCustomer name: %s\n", tempH->name);
      tempH = tempH->nxt;
    }
  }
}

Предполагается, что код составляет очередь из списка клиентов, в которых пользователь вводит свой номер телефона и имя, код работает хорошо, но когда я ввожу нового клиента, клиент перед именем все так или иначе становится именем последнего клиента.. Как мне решить это? Объявляю ли я массив строк 2D для сбора другого набора имени клиента?

1 Ответ

0 голосов
/ 01 ноября 2019

Я вижу следующие проблемы с кодом.

  1. head и tail должны быть инициализированы как NULL. Это означает пустой список.
  2. В функции initialnode вы непосредственно назначаете отсканированный указатель как newCustomer->name = n. Это не верно. Поскольку вы объявили структуру как имеющую символьный указатель, вам также необходимо выделить место для каждой строки отдельно.
  3. Функции enqueue и dequeue могут изменять значение указателей head и tail восновная функция. Вы можете изменить объявления функций для передачи двойного указателя для этого.
  4. Вам также необходимо освободить структуру по очереди. В небольших программах это строго не обязательно, но в любом случае рекомендуется избегать утечек памяти в более крупных программах.
  5. В функции отображения у вас есть неестественный malloc, который необходимо удалить. Эта функция не требует выделения памяти.
  6. Переменная choice в main не инициализирована.

Пожалуйста, смотрите код ниже

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

struct customer
{
  int phoneNum;
  char *name;
  struct customer *nxt;
};

struct customer *initialNode(int i, char *n);
int isEmpty(struct customer *head, struct customer *tail);
void enqueue(int phNum1, char *cName1, struct customer **head, struct customer **tail);
void dequeue(struct customer **head, struct customer **tail);
void display(struct customer *head, struct customer *tail);

int main(void)
{
  int phNum;
  char cName[51]; // max name length supported
  int choice = 0;

  struct customer *head;
  struct customer *tail;
  head = NULL;
  tail = NULL;

  while (choice !=4)
  {
    printf("\nEnter your option:");
    printf("\n1. Enqueue new customer. \n2. Dequeue customer. \n3. Display customer in queue. \n4. Exit. \nOption: ");
    scanf("%d", &choice);

    switch(choice)
    {
      case 1: 
      {
        printf("\nEnter customer phone number: ");
        scanf("%d", &phNum);
        printf("\nEnter customer name: ");
        scanf("%s", cName);
        enqueue(phNum, cName, &head, &tail);
        break;
      }
      case 2:
      { 
        dequeue(&head, &tail);
        break;
      }
      case 3: 
      {
        display(head, tail);
        break;
      }
      default: 
      {
        if (choice < 1 || choice > 4)
          printf("\nInvalid option!\n");
        break;
      }
    }
  }
  return 0;
}

struct customer *initialNode(int i, char *n)
{
  int len;
  struct customer *newCustomer = malloc(sizeof(struct customer));
  newCustomer->phoneNum = i;
  len = strlen(n);
  newCustomer->name = malloc(len +1);
  strcpy(newCustomer->name, n);
  newCustomer->nxt = NULL;
  return newCustomer; 
}

int isEmpty ( struct customer *head, struct customer *tail)
{
  if ((head == NULL) && (tail == NULL))
    return 1;
  else
    return 0;   //cannot is full because it is not array, have no size limitation
}

void enqueue(int phNum1, char *cName1, struct customer **head, struct customer **tail)
{
  struct customer *nC = malloc(sizeof(struct customer));
  nC = initialNode(phNum1, cName1);
  if (isEmpty(*head,*tail))
  {
    *head = nC;
    *tail = nC;
  }
  else if (*head == *tail)  // single element
  {
    (*head)->nxt = nC;
    *tail = nC;
  }
  else
  {
    (*tail)->nxt = nC;
    *tail = nC;
  }
  printf("\nSuccessfully enqueue a customer!\n");
}

void dequeue(struct customer **head, struct customer **tail)
{
  struct customer *removedCustomer = malloc(sizeof(struct customer));
  if (isEmpty(*head, *tail) == 1)
  {
    printf("\nThe queue is empty!\n");
  }
  else if (*head == *tail) // single element
  {
    removedCustomer = *head;
    free(removedCustomer->name);
    free(removedCustomer);
    *head = NULL;
    *tail = NULL;
  }
  else
  {
    removedCustomer = *head;
    *head = (*head)->nxt;
    free(removedCustomer->name);
    free(removedCustomer);
    printf("\nFirst customer is removed.\n");
  }
}

void display(struct customer *head, struct customer *tail)
{
  struct customer *tempH;
  tempH = head;
  if (isEmpty(head, tail) == 1)
  {
    printf("\nThe queue is empty!\n");
  }
  else
  {
    printf("\n===Current customer list===");
    while (tempH != NULL)
    {
      printf("\n\tCustomer phone number : %d", tempH->phoneNum);
      printf("\n\tCustomer name: %s\n", tempH->name);
      tempH = tempH->nxt;
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...