【问题标题】:Issue adding and deleting nodes from a linked list从链表中添加和删除节点的问题
【发布时间】:2014-09-24 19:21:40
【问题描述】:

我有一个程序,它必须从文本文件中获取输入,用这个输入创建一个链表,然后能够添加、删除、修改和查询链表。

我的查询和修改功能工作正常。我的删除功能在特定情况下失败,我正在努力使用添加功能。编译器没有错误可以提供帮助。如果有人能指出我正确的方向,将不胜感激。

add 函数给我带来了最大的问题。经过几个小时的调试和同事的帮助后,我最接近添加任何东西的地方正在发生变化

更新:感谢大家的反馈!我最终在同事的帮助下发现了我遇到的主要问题。显然我是在传递一个值而不是一个引用。 ** 为添加和删除功能做了诀窍。

void add(employee **head, int addEMP_ID, char* addName, int addDept, int addRank, double addSalary) {
}

void delete(employee **head, int option) {
}

【问题讨论】:

  • 是的,看起来是同一个任务。我在这里看到了很多,它们的做事方式略有不同,问题也略有不同。
  • 在那里启动一个伪 OOP。创建一个struct List{} 并将指针传递给它而不是head
  • 你每次删除一个节点吗?
  • 是的,一次只会删除一个节点

标签: c linked-list nodes


【解决方案1】:

如果头节点是你要删除的那个,它会在调用delete函数后被释放。但是,头指针仍然指向已经被释放的头节点。这就是导致段错误的原因。

一种改变方法是:

void delete(employee **head, int option) {

employee* current;
employee *del;
current = *head;

if (current != NULL) {
    if (current->EMP_ID == option) {
        del = *head;
        *head = *head->next;
        free(del);
        return;
    }
    while (current->next != NULL) {
        if (current ->next->EMP_ID == option) {
            del = current -> next;
            current->next = current ->next->next;
            free(del);
            return;
        }
    current = current -> next;
    }
}
return;
}

【讨论】:

    【解决方案2】:

    需要考虑两件事。

    开始一个伪 OOP,传递一个指向 struct List 而不是 struct Node 的指针。

    typedef struct structList {
        employeeData *head; 
    }  EmployeeList;
    

    使用double-pointer iterator 插入和删除。

    【讨论】:

    • 在头节点周围添加包装器有何帮助?任何节点都可以是它自己的链表的头......它是一个链表。
    • @EdS.:实际上,链表只有一个头——指向链表中第一个节点的指针。那是用来表示整个列表的指针。指向节点的任何其他指针都不是头,只是一个常规指针。这就是EmployeeList 应该强调的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 2020-09-10
    • 1970-01-01
    • 2013-01-08
    • 2011-12-17
    相关资源
    最近更新 更多