0

我已经尝试了大约 5 个小时以使此代码正常工作,并且代码是根据数小时的互联网研究编写的。我已经修改了好几次,所有这些都给了我分段错误,所以这是唯一可以运行的版本。正在发生的事情是,代码正在循环执行,并且不仅删除了您要删除的元素,还删除了它之前的所有元素。所以,如果你想删除最后一个元素,列表中的所有内容都会删除。或者,如果您想删除第二个元素,则执行第一个和第二个,依此类推。由于某种原因,它认为输入的每个名称都是顶级名称。

static void menu_delete_employee(void)
{
  char deletename[MAX_NAME_LENGTH+1]; 
  char namecheck[MAX_NAME_LENGTH+1]; 
  int errorcheck = 0;
  int foundit = 0;
  fprintf(stderr, "Enter the name of the employee you wish to delete\n");
  gets(deletename);
  employee_list = top;
  employee_list->name;

  do
  {
    strcpy (namecheck, employee_list->name);
    printf("namecheck = %s\n", namecheck);
    errorcheck = (strcmp (namecheck, deletename));
    printf("errorcheck = %i\n", errorcheck);

    switch (errorcheck)
    {
      case 0:
        {
          printf("This is the right name\n");
          foundit = 1;
          if (employee_list->prev == NULL)
          {
            printf("top name\n");
            top = employee_list->next;
          }
          else
          {
            if (employee_list->next == NULL) 
            {
              printf("last one\n");
              temp = employee_list->prev;
              temp-> next = NULL;
              free (employee_list);
            }
            else
            {
              printf("somewhere in the middle");
              temp = employee_list->prev;
              temp->next = employee_list->next;
              employee_list->next->prev = temp;
              free (employee_list);
            }
          }
          printf("delete successful\n");
          break;
        }
      default:
        {
          printf("not this one\n");
          errorcheck = 0;
          employee_list = employee_list->next;
          break;
        }
    }
  }
  while (foundit == 0);
  if (foundit == 0)
    printf("Name not recognised\n.");
  return;    
}

任何帮助将非常感激。

4

1 回答 1

0

也许双向链表没有按照您认为的方式构建。这必须首先检查。

假设拓扑是正确的,这段代码仍然存在一些问题:

employee_list->name;(就在do循环上方):这是什么?

strcpy (namecheck, employee_list->name);:你不需要复制,这只是一个简写,所以namecheck可以是一个(const)字符串指针。

switch (errorcheck): 这只有两个手臂,你为什么不用一个if

if (employee_list->prev == NULL) ...: 你只是将top指针移到这里,但不要删除最上面的项目,这会导致内存泄漏。您也不prev要将倒数第二项的指针设置为NULL

在“中间某处”部分:you freeemployee_list是当前位置指针。下一个要处理的项目应该是temp->next,对吧?这可能是您的问题,因为您不关心移动当前指针。此外,最好设置一个显式调用tobedeleted要删除的项目的指针,确保用于沿列表(employee_list在您的情况下)迭代的指针被适当移动,并且何时*tobedeleted从双向链表中适当地隔离出来发出free(tobedeleted)命令。

employee_list = employee_list->next;:您应该检查employee_list最后一项是否变为NULL,然后退出循环。否则会发生坏事。

最后的建议:你真的需要参考一本好的 C 书……例如Kernighan 和 Ritchie 。比“互联网研究”要好得多。

于 2013-05-07T12:42:10.207 回答