c - 删除链表中的第一个节点

标签 c linked-list

我的作业遇到了问题,该作业涉及编辑链接列表。我的代码似乎工作正常,但它不会删除学生 ID=1(或链表中的第一个节点)的数据项。 当我尝试删除链表上的第一个节点(或者 main() 中的 delete(1))时,它返回“未找到学生”消息。 有人可以告诉我出了什么问题吗?谢谢。

/****************************************************************************  
    Date        : 12 August 2015  
    Assignment  : Use linked list to build a database of student records, which supports find(), insert() and delete()  
    ****************************************************************************/

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

/* Define structure studentNode that contains ID, name, GPA and pointer to next studentNode*/
typedef struct student {
    int ID;
    char *name;
    float GPA;
    struct student *nextStudentNode;
} studentNode;

/* Initialize header */
studentNode *header;

/* Function prototypes*/
void insert(int ID, char *name, float GPA);
void printList();
void delete(int ID);

/* Main function which runs through while loop until sentinel value of q is typed by user. */
int main() {
    insert(3, "John", 3.5);
    insert(12, "Smith", 2.8);
    insert(1, "Mary", 1.8);

    printList();

    delete(1);    /***** there seems to be a problem here*********/
    delete(12);
    delete(3);
    printList();

    return 0;
}

/* Insert new student data */
void insert(int ID, char *name, float GPA) {
    studentNode *newStudent = (studentNode*)malloc(sizeof(struct student));

    newStudent->ID          = ID;
    newStudent->name        = name;
    newStudent->GPA         = GPA;

    newStudent->nextStudentNode = header; 
    header = newStudent;
}

/* Run through linked list one by one to print all data items */
void printList() {
    studentNode *tempNode;
    for (tempNode = header ; tempNode != NULL ; tempNode = tempNode->nextStudentNode) {
        printf( "ID:%d name:%s GPA:%f\n" , tempNode->ID, tempNode->name, tempNode->GPA);
    }
}

/* Delete student data */
void delete(int inputID) {
    studentNode *tempNode;
    studentNode **headerPtr = &header;

    for (tempNode = *headerPtr ;
         tempNode->nextStudentNode->ID != inputID && tempNode->nextStudentNode->nextStudentNode != NULL;
         tempNode = tempNode->nextStudentNode);

    studentNode *nodeToDelete = tempNode->nextStudentNode;

    if (nodeToDelete->ID != inputID) {
        printf("Student not found.\n");
    } else {
        printf("ID:%d name:%s GPA:%f is deleted.\n" , nodeToDelete->ID, nodeToDelete->name,
               nodeToDelete->GPA);

        tempNode->nextStudentNode = nodeToDelete->nextStudentNode;
        free(nodeToDelete);
    }
}

最佳答案

问题在于:

for( tempNode = *headerPtr ; tempNode->nextStudentNode->ID != inputID && tempNode->nextStudentNode->nextStudentNode != NULL ; tempNode = tempNode->nextStudentNode );

您正在从第二个学生开始检查,而不是第一个学生。因此,您将转到列表末尾而找不到正确的 ID。

更新:我的意思是列表顺序。

关于c - 删除链表中的第一个节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31995381/

相关文章:

C - 数组与 == 的比较有效,为什么?

c - 移动 n 位的 __m128i

c - dmalloc 提供返回地址信息显示 `unknown' ?

java - 使用链表进行多项式加法

c++ - 将新元素插入已排序的链表时出现段错误

c++ - 显示链表时倒序

c - 我有一个有很多返回点的函数。有什么方法可以让 gdb 告诉我哪一个正在返回吗?

找不到 typedef 的定义

java - 如何请求 n 个数据点(x 和 y 坐标)的集合,直到 java 程序从第一个坐标读取空行?

c - 在 CPU 调度模拟 C 程序(SJF)中,当节点放在 "queue"上时,如何按链表中的 CPU 时间对节点进行排序?