linux链表之:使用for循环添加链表、list_add、list_add_tail

使用for循环,向链表中添加10个节点

如果使用list_add,则将节点添加到链表头,那么使用后面的list_for_each打印时,便是倒着的:

*********************************************

index:9, name:name9

index:8, name:name8

index:7, name:name7

index:6, name:name6

index:5, name:name5

index:4, name:name4

index:3, name:name3

index:2, name:name2

index:1, name:name1

index:0, name:name0

*********************************************

如果使用list_add_tail,则将节点添加到链表尾,那么使用后面的list_for_each打印时,便是顺序打印的:

*********************************************

index:0, name:name0

index:1, name:name1

index:2, name:name2

index:3, name:name3

index:4, name:name4

index:5, name:name5

index:6, name:name6

index:7, name:name7

index:8, name:name8

index:9, name:name9

*********************************************

源码如下:

[email protected]:/mnt/shared/kernelbox/list# cat listuse.c
#include "list.h"

struct stListUse
{
        char name[32];
        int  index;
        struct list_head list;
};

LIST_HEAD(list_use_head);

struct stListUse *pstListNode;

int main(int argc, char *argv[])
{
        int i;
        char nametmp[32];
        struct stListUse *pstListTmp;
        struct list_head *tmp;

        printf("enter listuse.c/main()\n");

        for(i=0; i<10; i++)
        {
                pstListNode = (struct stListUse *)malloc(sizeof(struct stListUse));
                memset(pstListNode, 0, sizeof(struct stListUse));

                /* init node i */
                pstListNode->index = i;
                sprintf(nametmp, "name%d", i);
                strcpy(pstListNode->name, nametmp);

                /* add node i to list list_use_head */
                #if 0
                list_add(&pstListNode->list, &list_use_head);
                #endif

                list_add_tail(&pstListNode->list, &list_use_head);
        }

        pstListTmp =(struct stListUse *)malloc(sizeof(struct stListUse));

        /* print list */
        printf("*********************************************\n");
        list_for_each(tmp, &list_use_head)
        {
                pstListTmp = list_entry(tmp, struct stListUse, list);
                printf("index:%d, name:%s\n", pstListTmp->index, pstListTmp->name);
        }
        printf("*********************************************\n");

        return 0;
}
时间: 2024-10-05 04:58:51

linux链表之:使用for循环添加链表、list_add、list_add_tail的相关文章

【C语言数据结构】循环单链表

CircleLinkList.h #ifndef CIRCLE_LINK_LIST #define CIRCLE_LINK_LIST //链表节点 typedef struct _CircleLinkListNode {     struct _CircleLinkListNode *next; }CircleLinkListNode; //循环单链表 typedef void CircleLinkList; /*  * 创建循环单链表  * @return 返回循环单链表的指针  */ Cir

linux 链表之:初始化(INIT_HEAD)、添加(list_add)、遍历(list_for_each)及取节点list_entry

这里是最为简单的链表测试代码,使用如下接口: 初始化(INIT_HEAD).添加(list_add).遍历(list_for_each)及取节点list_entry 功能待丰富,目前代码如下: #include "list.h" struct stListUse { char *name; int index; struct list_head list; }; LIST_HEAD(list_use_head); struct stListUse *pstListNode; int m

一步一步写算法(之循环单向链表)

原文:一步一步写算法(之循环单向链表) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面的博客中,我们曾经有一篇专门讲到单向链表的内容.那么今天讨论的链表和上次讨论的链表有什么不同呢?重点就在这个"循环"上面.有了循环,意味着我们可以从任何一个链表节点开始工作,可以把root定在任何链表节点上面,可以从任意一个链表节点访问数据,这就是循环的优势. 那么在实现过程中,循环单向链表有什么不同? 1)打印链表数据 void pri

01-(2)数据结构- 一步一步写算法(之循环单向链表)

前面的博客中,我们曾经有一篇专门讲到单向链表的内容.那么今天讨论的链表和上次讨论的链表有什么不同呢?重点就在这个"循环"上面.有了循环,意味着我们可以从任何一个链表节点开始工作,可以把root定在任何链表节点上面,可以从任意一个链表节点访问数据,这就是循环的优势. 那么在实现过程中,循环单向链表有什么不同? 1)打印链表数据 [cpp] view plain copy void print_data(const LINK_NODE* pLinkNode) { LINK_NODE* pI

Python与数据结构[0] -&gt; 链表[1] -&gt; 双链表与循环双链表的 Python 实现

双链表 / Doubly Linked List 目录 双链表 循环双链表 1 双链表 双链表和单链表的不同之处在于,双链表需要多增加一个域(C语言),即在Python中需要多增加一个属性,用于存储指向前一个结点的信息. Doubly linked list: node_1 <---> node_2 <---> node_3 完整代码 1 from linked_list import LinkedList, test 2 3 4 class NodeDual: 5 def __i

02循环单链表

循环单链表定义:将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成了 一个环,这种头尾相接的单链表成为单循环链表. 循环链表的数据结构: 1 /* c2-2.h 线性表的单链表存储结构 */ 2 struct LNode 3 { 4 ElemType data; 5 struct LNode *next; 6 }; 7 typedef struct LNode *LinkList; /* 另一种定义LinkList的方法 */ 代码实现: 1 2 3 /* bo2-4.c 设立

循环单链表

//函数声明部分:#include"CirLinkList.h" #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef struct linknode { ElemType data; struct linknode *next; }node; void judgement_NULL(node * p); node 

循环单向链表(约瑟夫环)

#include <stdio.h> #include <stdlib.h> typedef struct List { int data; struct List *next; }List; //创建循环单向链表n为长度 List *list_create(int n) { List *head, *p; int i; head = (List *)malloc(sizeof(List)); p = head; p->data = 1; //创建第一个结点 for (i =

循环双链表

#include<iostream> using namespace std; struct LinkNode { int value; LinkNode* next; LinkNode* pre; }; LinkNode* createDoubleRoundLinkList() { LinkNode* head = (LinkNode*)malloc(sizeof(LinkNode)); head->next=head; head->pre=head; head->valu