繁体   English   中英

删除链表中的第一个节点

[英]Deleting first node in 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。

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

此函数在第一个循环中的条件

tempNode->nextStudentNode->ID != inputID && tempNode->nextStudentNode->nextStudentNode != NULL ;

是错误的,因为它会跳过第一个节点中的ID。

该函数可以写得更简单

/* Delete student data */
void delete( int inputID )
{
    studentNode *prev = NULL;
    studentNode *tempNode = head;

    while ( tempNode && tempNode->ID != inputID )
    {
        prev = tempNode;
        tempNode = tempNpde->nextStudentNode;
    }

    if ( tempNode )
    {
        if ( !prev ) head = tempNode->nextStudentNode;
        else prev->nextStudentNode = tempNode->nextStudentNode;

        free( tempNode );
    }
} 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM