尝试使用id变量从链表中删除节点。在c中

尝试使用id变量从链表中删除节点。在c中,c,linked-list,nodes,C,Linked List,Nodes,我正在尝试从链接列表中删除节点。当程序加载时,从文件填充列表 问题是,当我运行delete函数并输入要删除的id时,程序停止并卡住。它不会崩溃,只是什么也不做 我已经对它运行了调试,它将正确的数据传递给函数。temp变量似乎有问题,只有垃圾值 最初我没有使用malloc,但即使使用malloc,它仍然不起作用 void main() { initLinkList(); loadFile(); do{ menu(); switch (use

我正在尝试从链接列表中删除节点。当程序加载时,从文件填充列表

问题是,当我运行delete函数并输入要删除的id时,程序停止并卡住。它不会崩溃,只是什么也不做

我已经对它运行了调试,它将正确的数据传递给函数。temp变量似乎有问题,只有垃圾值

最初我没有使用malloc,但即使使用malloc,它仍然不起作用

void main() {
    initLinkList();
    loadFile();

    do{
        menu();
        switch (userChoice){
        case 1:
            add();
            userChoice = NULL;
            break;
        case 2:
            printNodes();
            userChoice = NULL;
            break;
        case 3:
            deleteNode();
            userChoice = NULL;
            break;
        case 4:
            deleteNode();
            userChoice = NULL;
            break;
        }
    } while (userChoice != -1);

    printf("\n\n\n");
    system("pause");
}

void deleteNode() {
    int empId = 0;
    char empFirstName[15];

    do {
        deleteMenu();
        switch (userChoice) {
        case 1:
            printf("Enter The ID of the person you want to delete\n");
            scanf("%d", &empId);
            listHead = deleteByID(listHead, empId);
            userChoice = NULL;
            break;
        case 2:
            printf("Enter The First Name of the person you want to delete\n");
            scanf("%s", empFirstName);
            listHead = deleteByName(listHead, empFirstName);
            userChoice = NULL;
            break;
        }
    } while (userChoice != -1);
} 

CONT *deleteByID(CONT *head, int num) {
    CONT *temp1, *ptr;
    //temp1 = (struct contact*)malloc(sizeof(struct contact));
    //ptr = (struct contact*)malloc(sizeof(struct contact));
    if (head->employeeId == num) {
       temp1 = head;
       head = head->next;
       free(temp1);
       return head;
    }
    ptr = head;
    while (ptr->next != NULL) {
        if (ptr->next->employeeId == num) {
            temp1 = ptr->next;
            temp1->next = ptr->next;
            free(temp1);
            return head;
        } //end if 
    } //end while
    printf("%d not present in the list\n", num);
    return head;
}

您不需要在循环中推进ptr来搜索id为的节点。while循环主体中的最后一条语句应该是ptr=ptr->next。通过ptr->next访问所有内容也很笨拙。为什么不直接使用ptr并用“head->next”对其进行初始化呢?哦,对于指向现有内存的指针,不需要malloc资源,比如遍历列表的临时指针。当您需要为新对象或动态大小的数组创建句柄时,malloc非常有用。关于如何从链接列表中删除节点的stackoverflow,有很多示例,建议您进行一些搜索/谷歌搜索,以找到大量examples@user3629249如果我不去其他地方看看,研究一下,我就不会问了。如果这就是你所拥有的,为什么还要费心回答呢?有很多人很乐意帮助你,但除非你给出一个可验证的例子,否则没有人能帮助你。请参阅:。例如,listHead是如何声明、初始化和填充的?这只是一个例子。这就是为什么我们需要一个完整的可验证的例子。