我正在使用这两种结构,第一种保存员工信息,第二种保存列表信息:
typedef struct ListNodeTag{
int idNumber;
struct ListNodeTag *next;
} Employee;
typedef Employee Item;
typedef struct {
int size;
Item *head;
} List;
我有一个名为Peek的函数,我在其中发送一个位置,列表的头部以及一个指向Employee的元素的指针。
void Peek (int position, List *L, Item *X) {
int i;
Item *currentPtr;
currentPtr = L->head;
for(i = 0; i < position; i++){
if(currentPtr->next == NULL){
X = currentPtr;
break;
}
currentPtr = currentPtr->next;
}
X = currentPtr;
}
我在此循环中调用main函数Peek。
for(i=0;i<Length(&L);i++){
Peek(i,&L,&S);
printf(" %d%\n",idNumber);
}
它的目的是使用新员工ID在新行上打印列表的每个成员。但是,当调用第二个成员时,第currentPtr = currentPtr->next;
行发生了一个seg-fault
我的列表中的数据是从这个插入函数填充的:
void Insert (Item X, int position, List *L) {
int i;
Item *currentPtr,*previousPtr;
Item *temp = malloc(sizeof(Item));
temp->idNumber = X.idNumber;
temp->next = NULL;
previousPtr = NULL;
if(L->head == NULL){
L->head = temp;
}
else{
currentPtr = L->head;
for(i=0;i<=position && currentPtr!=NULL;i++){
previousPtr = currentPtr;
currentPtr = currentPtr->next;
}
temp->next = currentPtr;
previousPtr->next = temp;
}
L->size +=1;
}
在打印时,我能够在没有段错误的情况下获得结果,但是,无论列表多长,都是重复的相同条目。 EG:长度为3我得到:
10925
10925
10925
答案 0 :(得分:0)
此代码至少存在两个问题。
第一个问题在于您的Peek
功能。看最后一行:
X = currentPtr;
回想一下,C是一种call by value语言,这意味着此行只会更改Peek
的{{1}}的本地值,当X
返回时,该值就会被丢弃; Peek
永远不会看到它。
您需要将main
更改为
Peek
然后void Peek (int position, List *L, Item **X) {
的最后一行应更改为
Peek
因此,您需要将*X = currentPtr;
中X
传递的值更改为main
。你没有说你在Peek
函数中如何声明S
,但我认为它目前的形式是:
main
然后您需要将其更改为
Item *S;
Item *S[1];
来电可以单独作为
Peek
完成这些更改后,Peek(i,&L,&S);
将声明长度为main
个指针的数组S
,并将Item
的地址传递给S
。然后,Peek
的最后一行将Peek
存储在其currentPtr
值指向的地址处,写入数组X
中的第一个Item
指针。
第二个问题是S
循环:
for
为什么期望for(i=0;i<Length(&L);i++){
Peek(i,&L,&S);
printf(" %d%\n",idNumber);
}
在循环的每次迭代中打印不同的东西?循环中根本没有改变printf
!对于idNumber
的(固定)版本,唯一被更改的是数组Peek
的第一个元素,因此您需要S
之类的内容。
您还应该从printf("%d\n", S[0]->idNumber);
,
X = currentPtr;
Peek
因为它是多余的;在if(currentPtr->next == NULL){
X = currentPtr;
break;
}
语句之后立即运行完全相同的行(在未修改的Peek
中)。