美好的一天。有人知道如何在 c 中使用 linkedlist 处理下一个和上一个数据吗?在链表中获取以前的数据后,我获得了 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++;
}
对于左边只有减号。希望有人能帮助我。谢谢
如果你真的想实现左/右移动,那么仅仅添加一个减号是行不通的。您需要实现一个双向链表才能在两个方向上移动。
向左移动时可能会返回 NULL,因为您在向右移动时更改头部指针,并且一旦更改头部指针,就会丢失一些节点,因为您的搜索不是双向的,因为它不是双向链表,因此返回结束节点 (NULL)。
从你的问题中还不清楚你想实现什么。但是,您仍然可以在下面找到一些指针:
- 始终
- 建议始终维护指向链表"head"的指针。但是,您不断在 moveRight 函数中修改它。
- 如果你想无缝地左右移动,那么最好实现一个双向链接列表。
使用您当前的单向链表解决方案,您可以尝试以下代码进行 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.
}