0

再会。任何人都知道如何在 c 中使用链表来处理下一个和上一个数据?在我获得链表中的前一个数据后,我得到 NULL 值,如果我移动到右键(传递我想要获取的索引),则获取下一个数据没有任何问题,但是如果我将键移到左侧,我得到了NULL 值,即使我再次传递索引并获取我需要的数据。这是我的示例添加和获取链表代码。

typedef struct samp{
int idx;
char *name;
struct samp *next;
}sampLink;



sampLink *head=NULL,tail=NULL,test;
int addList(int idx,char *name){
  sampLink *tryi=NULL;
  tryi=(sampLink*)calloc(1,sizeof(sampLink));
  tryi->idx=idx;
  tryi->name=strdup(name);
  tryi->next=NULL;

  if(head==NULL){
    head=tryi;
    tail=tryi;
  }else{
    tail->next=tryi;
    tail=tail->next;
  }
  return 0;
}

sampLink *getList(int idx){
do{
    if(idx==head->idx){
      return head;
    }
    head=head->next;
  }while(head!=NULL);
  return head;
}

右移

void moveRight(){
int i=0;
test=getList(i);
i++;
}

左边只是减号。希望有人能帮助我。谢谢

4

2 回答 2

1

如果您真的想实现左/右移动,那么仅添加减号是行不通的。您需要实现一个双向链表,以便能够在两个方向上移动。

向左移动时可能会返回 NULL,因为向右移动时正在更改头指针,并且一旦更改头指针就会丢失一些节点,因为您的搜索不是双向的,因为它不是双向链表,因此返回结束节点 (无效的)。

于 2012-05-29T07:46:30.877 回答
1

从您的问题来看,您要达到的目标并不是很清楚。但是,您仍然可以在下面找到一些提示:

  1. 始终建议始终维护指向链表“头”的指针。但是,您在 moveRight 函数中不断修改它。
  2. 如果你想无缝地左右移动,那么最好实现一个双向链表。

使用您当前的单链表解决方案,您可以尝试下面的 getList 代码

sampLink *getList(int idx)
{ 
  sampLink *temp = head;
  do{     
       if(idx==temp->idx)
       {       
         return temp;     
       }     
      temp=temp->next;   

    }while(temp!=NULL);   //Now, the function only keeps modifying the temp pointer rather than the head pointer, so each time you call the function, if idx is valid, it will return a pointer.

 return NULL; //If you had encountered a node which is having idx, you would have returned in the loop itself, so returning NULL here.
}
于 2012-05-29T08:22:16.387 回答