【发布时间】:2013-09-26 00:38:41
【问题描述】:
我正在使用这两个结构,第一个保存员工信息,第二个保存列表信息:
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; 行发生段错误
我列表中的数据是通过这个插入函数填充的:
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
【问题讨论】:
-
您有一个
for循环到每个next位置。但是您并没有检查您是否点击了 NULL 的next。但是,这里缺少很多代码,因此很难判断您是如何填充数据的。 -
我已经添加了我的插入功能以获得更多细节。如果它达到 NULL 那么我想它应该自动中止以避免段错误?
-
它将如何“自动”中止?如果它引用 NULL 作为下一个指针,它将发生段错误。所以想象一下在循环迭代中,
currentPtr->next的值为 NULL 的情况。然后currentPtr的下一个值通过赋值变为NULL。然后下一次通过你尝试的循环,基本上,NULL->next将出现段错误。 -
哦!我添加了一个 if 语句
if(currentPtr->next == NULL){break;} 但是它也有段错误。错误可能出在我设置下一个指针的方式上吗? -
我认为您需要显示更新后的代码。我不确定你把
if放在哪里。但类似的事情可能正在其他地方发生。当你在 C 中使用指针时,你必须仔细考虑它们的使用,以确保它们在你需要的时候被设置为你想要的。
标签: c pointers data-structures struct linked-list