如何在链表中保存并获取下一个和以前的数据?

时间:2012-05-29 06:58:09

标签: c linux list linked-list

美好的一天。任何人都知道如何使用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;
}

for moveRight

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

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

2 个答案:

答案 0 :(得分:1)

如果你真的想要实现左/右移动,那么只添加一个减号就不行了。您需要实现双向链表才能在两个方向上移动。

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

答案 1 :(得分:1)

关于你想要达到的目标,你的问题并不是很清楚。但是,你仍然可以在下面找到一些指示:

  1. 始终建议保持指向“头部”的指针。总是链接列表。但是,你在moveRight函数中继续修改它。
  2. 如果您想要无缝地左右移动,那么最好实现双向链接列表。
  3. 使用您当前的单链表解决方案,您可以尝试使用以下代码获取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.
    }