访问链接列表中的结构

时间:2016-03-26 21:39:15

标签: c pointers struct linked-list

我有一个指向链接列表中第一个结构的指针,但我怎么能打印出链表的第5个结构呢?

链接列表由100个结构组成,所有结构都按顺序排序,但是如何打印出例如链表的第4和第7个结构?

struct human {
    char name[STR]; 
    char manuf[STR];
    int age;
    float weight;
    struct human *next; 
}

struct human *current; //Points to current structure.
struct human *first = NULL;

......

 for (current = first; current != NULL; current = current->next) {
     fprintf(stdout, "%s  %s  %d  %f \n", out->name, out->surname,
             out->age, out->weight);
 }

“first”将指向链表的第一个元素(它是通过代码中的某个函数定义的)。此代码将打印出链表中的每个结构,但我只想打印出选定的结构,如第4和第7。我怎么能做到这一点?

4 个答案:

答案 0 :(得分:0)

您可能应该首先通过一些YouTube视频了解链接列表遍历。 你需要从头开始

int position= 4;//considering u need to get the 4th element
int output;// stores the final output
struct human *temp= current;
for(i=0; i<position-1;i++)
{
   temp=temp->next;
}

在此for循环结束时,您将到达所需的节点。

output= temp->age;//u can access any other data you want as well in the node

您也可能希望在for循环中执行某些错误检查,例如 -

for(i=0; i<position-1;i++)
{
   temp=temp->next;
   if(temp==NULL)
   {
     break;
   }
}

答案 1 :(得分:0)

您可以定义跳过功能,例如

struct human * skip(struct human * head, int num)
{
    while (num-- > 0)
    {
        head = head -> next;
    }
    return head;
}

struct human * fifth = skip(first, 4);
fprintf(stdout, "%s  %s  %d  %f \n", out->name, out->surname,
         out->age, out->weight);

如果您想要打印非连续节点,那么您可以执行以下操作:

int markers[] = { 3, 5, 7};
int index = 0;

for (current = first; current != null ; current = current -> next, index++)
{
    int j;
    for (j=0; j < sizeof(markers)/sizeof(markers[0]); j ++)
    {
       if (markers[j] == index)
       {
             fprintf(stdout, "%s  %s  %d  %f \n", out->name, out->surname,
                              out->age, out->weight);
       }
    }
}

答案 2 :(得分:0)

首先,您需要定义如何获得这些数字;它们是以静态方式定义还是定义它的用户?

一旦你做对了,就可以将这些数字存储到从最小到最大排序的数组中,在循环中你可以检查迭代器是否等于数组中的下一个数字。

int myNumbers[] = {1,2,5};//You will set this values as mentioned in the first place
int iterator = 0, indexToNext=0;
for(current = first; current != NULL; current = current->next, iterator++){
     if (iterator == myNumbers[indextToNext]){
         fprintf(stdout, "%s  %s  %d  %f \n", out->name, out->surname,
                 out->age, out->weight);
         indexToNext++;
     }
}

答案 3 :(得分:0)

一个简单的解决方案是使用一个方法来获取一个指定要打印的位置的整数的数组,如[4,7]。记得要考虑数组的大小。对数组进行排序很重要,或者您必须多次遍历链表才能获得所有位置。

然后就像你正在做的那样,有一个循环,增加一个计数器并在数组中的位置。如果counter == position [x] print。在数组完成或链表完成后中断循环。

您可能还想检查数组中的int是否不大于链表的大小。