C易懂详解单链表(含图)

     逐个代码行讲解最简单链表,并画出链表代码示意图。这个需要多画画图才能理解。

一、先定义一个结构体

typedef struct
{
    int data;  //数据域 
    struct LNODE *next;  // 指向下一个结构体的指针域
} LNODE,*LinkList;   //  结构体的别名

二、前插法

LinkList creat(LinkList L,int NUM)
{
    int i;
    LinkList p,q;
    L = (LinkList)malloc(sizeof(LNODE));  // 赋予节点空间    (LinkList)为L的类型  malloc   (sizeof(LNODE))为赋予LNODE大小的指针
    L->next =NULL; // 初始化链表 先建立一个带头结点的空链表
    for(i=0; i<NUM; i++)
    {
        p= (LinkList)malloc(sizeof(LNODE));    // 每插入一个节点都需要分配空间
        if(!p)
        {
            exit(0);    //  判断分配空间成功与否
        }
        printf("Please input the data of Car\n");
        scanf("%d",p->data);

        p->next=L->next; // L的下一个节点与p的下一个节点连接,即P后面放置L的下一个节点
        L->next=p;    //   L的下一个节点被p覆盖掉,p成了L的下一个节点,且p的下一个节点是L之前的下一个节点
    }
    return L;
}


三、后插法

LinkList creat(LinkList L,int NUM)
{
    int i;
    LinkList p,q;                          //创建q的原因是因为,q在下面会不断变为尾节点,故不可以用L,L不变才能正常顺序输出
    L = (LinkList)malloc(sizeof(LNODE));  // 赋予节点空间    (LinkList)为L的类型  malloc   (sizeof(LNODE))为赋予LNODE大小的指针
    L->next =NULL; // 初始化链表 先建立一个带头结点的空链表
    q= (LinkList)malloc(sizeof(LNODE)); //  q 本身是一个节点 (important)
    q=L;      //将L赋予q
    for(i=0; i<NUM; i++)
    {
        p= (LinkList)malloc(sizeof(LNODE));    // 每插入一个节点都需要分配空间
        if(!p)
        {
            exit(0);    //  判断分配空间成功与否
        }
        printf("Please input the data of Car\n");
        scanf("%d",p->data);
    
        p->next=NULL;
        q->next=p;    //将P放置在q(L)后面
        q=p;   //q指向新节点*P  ( p(节点)向右移一位,为尾节点)便于插入新数据
    }
    return L;
}

猜你喜欢

转载自blog.csdn.net/qq_37334150/article/details/78968958