0

我正在使用这两个结构,第一个保存员工信息,第二个保存列表信息:

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 的列表中的每个成员。然而,列表的第一个成员,当第二个被调用时,会在该行发生 seg-faultcurrentPtr = 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
4

1 回答 1

0

这段代码至少有两个问题。


第一个问题是你的Peek功能。看最后一行:

X = currentPtr;

回想一下,C 是按值调用的语言,这意味着这一行只改变Peek的本地值X,返回时简单地丢弃Peekmain从来没有看到它。

你需要改变Peek成类似的东西

void Peek (int position, List *L, Item **X) {

然后最后一行Peek应该改为

*X = currentPtr;

X因此,您需要将作为by传递的值更改mainPeek。你没有说你是如何S在你的main函数中声明的,但我认为它目前的形式是:

Item *S;

然后,您需要将其更改为

Item *S[1];

Peek呼叫可以单独作为

Peek(i,&L,&S);

在这些更改之后,将声明一个长度为 1 的指针main数组,并将传递to的地址。然后的最后一行存储在其值指向的地址处,并覆盖数组中的第一个指针。SItemSPeekPeekcurrentPtrXItemS


第二个问题是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之后立即运行。break

于 2013-09-26T02:16:03.857 回答