双向链表 C,在特定位置插入



我真的可以在一个地址簿程序上获得一些帮助,我已经挣扎了好几天了。我正在使用 C 中的双向链表。我正在尝试将节点添加到用户输入的位置列表中,从位置 0 开始。仓位不会超出范围。(在位置 1 处没有插入,然后在位置 0 等处插入内容(不过,这些位置可以重复:将新节点插入到上一个位置占用者之前的位置。(例如:如果位置 1 有 x,并且在位置 1 插入了带有 y 的新节点,则位置 1 现在有 y,位置 2 有 x(

我需要获取用户输入的职位编号并检索该职位的当前人员,但我不能完全正确。此外,如果您也想看看它,我已经包含了我的插入功能,因为它也无法正常工作。感谢您的任何帮助!

编辑:现在的主要问题是我用于查找pPersonCur的代码在位置= = 1时失败。此外,插入功能未按正确的顺序输入内容(位置中的最新插入不会正确替换较旧的插入(。然而,损坏的pPersonCur代码使得很难诊断为什么会这样。

地址簿.h 摘录:

typedef struct person Person;
struct person {
    char lastName[255];
    char firstName[255];
    char email[255];
    char phoneNumber[255];
    Person *pNext;
    Person *pPrev;
};

地址簿.c 摘录:

#include "addressbook.h"
Person * InsertPerson(Person * pPersonCur) {
    Person * pPersonNew;
    /* data gathered for CreatePerson() function here */
    pPersonNew = CreatePerson(pLastName, pFirstName, pEmail, pPhoneNumber);
    if (pPersonCur)
    {
        pPersonNew->pNext = pPersonCur;
        pPersonNew->pPrev = pPersonCur->pPrev;
        pPersonCur->pPrev = pPersonNew;
        if (pPersonNew->pPrev)
            pPersonNew->pPrev->pNext = pPersonNew;
    } else
    {
        pPersonNew->pPrev = pFirst;
        pPersonNew->pNext = NULL;
        if (pFirst)
            pFirst->pNext = pPersonNew;
    }
    return (pPersonNew);
}

主C节选:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "addressbook.h"
Person *pFirst;    /* First name in list */
int main(void) {
        Person *pPersonCur = NULL;    /* current Person */ 
        int bDone = 0, position = 0, counter = 0;
        pFirst = NULL;
    printf("Readyn");
    while (!bDone) {
        char input = getchar();
        switch (input) {
        case 'a':
            counter = 0;
            scanf("%d", &position);    /* Where desired position is entered */
            if (position == 0) {
                if (pFirst) {
                    if (pFirst->pNext) {
                        pPersonCur = pFirst->pNext;
                    }
                } else {
                    pPersonCur = pFirst;
                }
            } else {
                pPersonCur = pFirst->pNext;
                while (counter < position) {
                    pPersonCur = pPersonCur->pNext;
                    counter++;
                }
            }
            InsertPerson(pPersonCur);    /* Takes in person at desired position, return value is new inserted person */
            break;
        /* Some other cases here */
        case 'q':
            bDone = 1;
            break;
        }
    }
/* Rest of code */

似乎您永远不会为pFirst赋值。
当位置不0时,执行行pPersonCur = pFirst->pNext;,并且此位置的pFirst仍然NULL

在插入函数中添加条件以检查是否分配了列表的头部。

Person * InsertPerson(Person * pPersonCur) {
    . . . 
    else
    {
        pPersonNew->pPrev = pFirst;
        pPersonNew->pNext = NULL;
        if (pFirst)
            pFirst->pNext = pPersonNew;
        else
            pFirst = pPersonNew; // If pFirst is not assigned, assign it to newly created person
    }
    return (pPersonNew);
}

尽管如此,如果您碰巧用NULL参数调用InsertPerson,您的代码会在第一个Person之后放置新并切断列表的其余部分。

要使用 NULL 调用时将新Person放在列表末尾,您可以在 InsertPerson 函数中使用类似以下内容:

if(pFirst) {
    Person *last = pFirst;
    while(last->pNext != NULL) {
        last = last->pNext;
    }
    last->pNext = pPersonNew;
    pPersonNew->pPrev = last;
}
else
    pFirst = pPersonNew;

如果给出的位置索引高于列表中的节点,则根据位置索引插入也可能失败。还应添加某种安全检查。

pPersonCur = pFirst->pNext;
while (counter < position && pPersonCur->pNext != NULL) { // If last node reached, stop the loop
    pPersonCur = pPersonCur->pNext;
    counter++;
}

如果仓位指数太高,此实现会将新Person添加到列表末尾。

相关内容

  • 没有找到相关文章

最新更新