当前位置: 首页 > 知识库问答 >
问题:

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

周浩博
2023-03-14

我真的需要一些帮助来解决我已经努力了几天的地址簿程序。我正在用C语言处理双向链表。我试图在用户输入的位置将节点添加到列表中,从位置0开始。位置将不会被输入超出范围。(在位置0等位置之前,位置1没有插入)但是位置可以重复:将新节点插入在前一个位置占用者之前的位置。(例如:如果位置1有x,并且新节点插入位置1有y,则位置1现在有y,位置2有x)

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

编辑:现在的主要问题是,当position==1时,查找pPersonCur的代码失败。此外,insert函数没有按正确的顺序输入内容(位置中的最新插入不能正确替换旧插入)。然而,损坏的Perpsoncur代码使得很难诊断出这到底是为什么。

通讯录。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);
}

main. 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("Ready\n");

    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 */

共有1个答案

蒋俊
2023-03-14

似乎您从未为pFirst赋值
当位置不为0时,行pPersonCur=pFirst-

向insert函数添加一个条件,以检查列表的标题是否已分配。

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之后放置新的Person,并删除列表中的其余部分。

当使用NULL调用时,要将newPerson放在列表的末尾,您可以在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++;
}

如果职位索引过高,此实现将在列表末尾添加新的人员

 类似资料:
  • 我想写一个函数,将一个节点添加到一个树中,该树以根、节点的值、我想添加新节点的节点的值和一个数字作为参数,根据该数字我将节点添加为左或右子节点(偶数=右子节点,奇数=左子节点)。我不明白我错在哪里,这与BST的概念相同,只是其他条件。如果有任何帮助,我将不胜感激。 例如: Tnode*insert(Tnode*root,int data,int father,int leftOrRight);插入

  • 我有以下代码,它是双链表实现的一部分。然后,我必须使用我的ADT实现来创建一个表,其格式为(它是一个字符串)、(它是uint32_t类型)(因此是一个2列的表)。 我需要首先创建这个表,然后添加到这个记录。 我的困难在于实现一个函数,该函数将要添加的值插入到这个特定的表中。我需要另一个插入功能,还是必须编辑我拥有的功能? 如果需要一个新的函数作为参数:一个指向结构类型的新表>代码> ListSt目

  • 我的程序不断崩溃。我觉得我的逻辑有问题。请帮忙!谢谢

  • 分段故障发生在“电流->prev->next=temp”上。我试图打印地址以了解为什么会发生这种情况,并发现在输入中第一个节点的前一个元素总是指向NULL。有人能解释为什么会发生这种情况以及如何修复它吗?谢谢你。

  • 我有一个家庭作业要写“先到先得”和“循环模拟”并比较它们。我开始创建一个链表来制作事件列表。我制作了插入和打印列表函数,但无法使其工作。我的朋友告诉我使用双链表,所以我重新创建了链表,并试图使插入函数工作。我修复了大部分问题,但现在找不到插入函数的错误。当我比较是否插入指针数据和当前指针数据时,While循环语句出现分段错误。我已经阅读了我的C语言书,书中的代码与我的代码相似,并且还通过了双链表分

  • 我第一次使用链表,必须创建一个可以在双链表末尾插入节点的函数。到目前为止我 Node类按顺序接受要存储的值、要指向的下一个指针的值和上一个指针的值。每当我试图在这里插入节点时,我都会得到一个错误,说有一个未处理的异常,并且在写入位置0x00000008时有访问冲突。 我不完全确定这里出了什么问题,但我认为这与根据错误消息取消引用空指针有关。我真的很感激有人帮忙解决这个问题。