用于返回C中链表的列表节点的功能

时间:2013-09-26 00:38:42

标签: c pointers data-structures struct linked-list

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

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

1 个答案:

答案 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中)。