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; idata);

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


C易懂详解单链表(含图)_第1张图片

 

 

 

三、后插法

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; idata);
    
        p->next=NULL;
        q->next=p;    //将P放置在q(L)后面
        q=p;   //q指向新节点*P  ( p(节点)向右移一位,为尾节点)便于插入新数据
    }
    return L;
}

 

C易懂详解单链表(含图)_第2张图片

 

说简单点就是,L不携带数据的头节点,q、p,q作为L的替身,俩者刚开始的时候q=L,指向同一个结构体的存储空间,然后q=q->next,q=p.  q指向新节点的空间,不断往后指,一直为末端节点。而L节点所指向的地址是没有变换的,他还是指在第一个头节点,但是它的next指向因为最初的q=L,q->next=p;是指向首元节点的也就是第一个p(数据节点)。故此,用替身q并不会改变以L为头节点的链表的顺序,也就是说L还是最初的NO.1,此为意义所在。

 

LinkList creat(LinkList L,int sum)
{
    int node,i;
    LinkList q,p;

    L = (LinkList)malloc(sizeof(Node));
    q=(LinkList)malloc(sizeof(Node));
    L->next= NULL;
    q = L;        //指向同一个L的空间


    printf("请输入线性表中各个元素:\n");

    for(i=0;idata=node;
        q -> next= p;
        q = p;              //指向下一个节点,俩俩传递 , q是中间搭建节点

    }
//    printf("%d\n",L->next->data);
    q -> next= NULL;
    return L;
}



void putnum(LinkList L,int sum)
{
    int i;
    LinkList p;
    p = L->next;
    while(p!=NULL)
    {
        printf("%d\n",p->data);
        p=p->next;

    }
}

void delet(LinkList L,int sum)
{
    int i,x;
    LinkList p,q;
    p=L;
    printf("请输入你要删除第几个数据:");
    scanf("%d",&x);
    for(i=0;inext;
    }
    q=p->next;
    p->next = q->next;//q=q->next

    free(q);
}

void add(LinkList L){
   LinkList q,p,r;
   r=(LinkList)malloc(sizeof(LinkNode));
   p=(LinkList)malloc(sizeof(LinkNode));
   q=L;
   q=q->next;
   while(q!=NULL){
    r=q;
    printf("%d",q->data);
    q=q->next;
   }
   p->data = 666;
   p->next = NULL;
   r->next = p;
}

int main()
{
    LinkList L;
    int e;
    int sum;scanf("%d",&sum);
    L=creat(L,sum);
    putnum(L,sum);printf("请输入你要在第几个元素后插入数据:");
    scanf("%d",&e);
    insert(L,e);
    putnum(L,sum);
    delet(L,sum);
    putnum(L,sum);
}

 

你可能感兴趣的:(繁杂需要记录的C,数据结构)