我真的可以在一个地址簿程序上获得一些帮助,我已经挣扎了好几天了。我正在使用 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
添加到列表末尾。