单链表的建立(学习笔记)

写在前面的一些话:这只是个人学习王道数据结构的代码笔记,仅供参考,如果有错误请友好的指出,谢谢!!!

一、单链表的尾插法

由于使用头插法建立单链表,表内数据顺序与输入数据顺序刚好相反,如果要使链表数据顺序与输入数据顺序一致,使用单链表的尾插法,即在创建链表的时候使用一个一直指向尾节点的尾指针

#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{//定义单链表的节点类型
    int data;           //每个节点存放一个数据元素
    struct LNode *next;//指针指向下一个节点
}LNode,*LinkList;
LinkList List_TailInsert(LinkList &L){
    int x;
    L=(LinkList) malloc(sizeof (LNode));//创建头节点
    L->next=NULL;
    LNode *s,*r=L;                          //r为表尾指针
    scanf("%d",&x);                 //输入节点的值
    while(x!=9999){                          //输入9999表示结束
        s=(LNode *) malloc(sizeof(LNode));//在r节点后插入一个节点
        s->data=x;
        r->next=s;
        r=s;                                //表尾指针指向新的表尾
        scanf("%d",&x);
    }
    r->next=NULL;                           //表尾节点设置为空
    return L;
}
void PrintLinkList(LinkList L){
    //依次打印单链表的数据域的数据
    LNode *p=L->next;
    printf("单链表的元素依次为:");
    while(p) {
        printf("%d  ", p->data);
        p=p->next;
    }
}
int main(){
    LinkList L;
    List_TailInsert(L);
    PrintLinkList(L);
    return 0;
}

二、单链表的头插法

单链表的头插法

#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{//定义单链表的节点类型
    int data;           //每个节点存放一个数据元素
    struct LNode *next;//指针指向下一个节点
}LNode,*LinkList;
LinkList List_HeadInsert(LinkList &L){
    //头插法建立一个单链表
    LNode *s;
    int x;
    L=(LinkList)malloc(sizeof(LNode));//创建初始头节点
    L->next=NULL;//初始为空链表L->next=NULL
    scanf("%d",&x);
    while(x!=9999){                         //表示输入9999结束
        s=(LNode *)malloc(sizeof(LNode));//创建新节点
        s->data=x;
        s->next=L->next;
        L->next=s;                             //将新节点插入表中
        scanf("%d",&x);
    }
    return L;
}
void PrintLinkList(LinkList L){
    //依次打印单链表的数据域的数据
    LNode *p=L->next;
    printf("单链表的元素依次为:");
    while(p) {
        printf("%d  ", p->data);
        p=p->next;
    }
}
int main(){
    LinkList L;
    List_HeadInsert(L);
    PrintLinkList(L);
    return 0;
}

头插法的妙用

使用头插法得到一个链表的逆置

#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{//定义单链表的节点类型
    int data;           //每个节点存放一个数据元素
    struct LNode *next;//指针指向下一个节点
}LNode,*LinkList;
LinkList List_HeadInsert(LinkList &L){
    //头插法建立一个单链表
    LNode *s;
    int x;
    L=(LinkList)malloc(sizeof(LNode));//创建初始头节点
    L->next=NULL;//初始为空链表L->next=NULL
    scanf("%d",&x);
    while(x!=9999){                         //表示输入9999结束
        s=(LNode *)malloc(sizeof(LNode));//创建新节点
        s->data=x;
        s->next=L->next;
        L->next=s;                             //将新节点插入表中
        scanf("%d",&x);
    }
    return L;
}
LinkList List_Inversion(LinkList L){
    //利用头插法实现单链表的逆置
    LinkList S=(LinkList) malloc(sizeof(LNode));
    S->next=NULL;//初始化头节点为空
    LNode  *q,*p=L->next;
    while(p!=NULL){
        q=(LNode *) malloc(sizeof (LNode));
        q->data=p->data;
        q->next=S->next;
        S->next=q;
        p=p->next;
    }
    return S;
}
void PrintLinkList(LinkList L){
    //依次打印单链表的数据域的数据
    LNode *p=L->next;
    printf("单链表的元素依次为:");
    while(p) {
        printf("%d  ", p->data);
        p=p->next;
    }
}
int main(){
    LinkList L;
    List_HeadInsert(L);//头插法创建一个链表L
    LinkList S;//存放链表L的逆置
    PrintLinkList(L);
    S=List_Inversion(L);
    PrintLinkList(S);
    return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值