小楼一阁的数据结构学习笔记(三、单链表)

一、什么是链表

        链表是一种链式存储结构,像链条一样,是一个节点一个节点之间组成的,是一小块一小块组成的,不是一个整块的内存,每一个小块,下图是一个单链表。最简单的最基础的模型。每一个小黄色方块成为节点。数据结构分成链式存储结构和非链式存储结构。

二、顺序表和链表的区别

        No.1:顺序表是顺序存储结构,是申请的一整块内存,在内存中是可以通过索引来找到其中的元素的,链表不是,链表申请很多小块内存串到一起的。

        No.2:各自的优劣----》顺序表因为是“一整块”,所以顺序表的元素插入和删除比较麻烦,在上一篇中已经写到了,而链表的优势就在此,可以使用很小的资源在链表中插入和删除

        No.3:链表和顺序表贯穿整个数据结构之中,以后的很多种结构都是基于这两种结构的。

三、链表的初始化、增加、删除、查找

        链表的初始化需要作的是定义一个空的头结点,头结点一般不存放数据,这可以避免很多问题。比如插入删除是否需要考虑头结点的问题。链表的这四个操作学会之后就可以通过简易的结合组合其他的功能。

链表的节点:


链表的结构体:

typedef struct list {
    int data;
    struct list *next;
}List;

初始化函数:

List* InitList(List *head) {
    head = (List *)malloc(sizeof(List));
    head->next = NULL;
    return head;
}

        这一句是先申请一个头结点让他的next项指向空,因为链表的最后一项都是指向空的。申请完如图:

增加函数:

增加操作看图首先是两个节点


等待插入第三个申请完的节点P


插入了阿!!!!!首先把新节点的next指向后一个节点(顺序不能错!!!)


然后拆了原来的把新的放进去!!!!让后一个节点的next指针指向新的那个,新的那个不就连上了~~~好简单有木有!!!


连上了吧!!!下面分析代码。

List* insertList(List *head) {
    List *p = NULL,*pr = head;   //首先咱有一个p用来放进去的节点和一个指向当前的pr(图中有体现)
    char c;                      //这三句是循环添加节点的,链表不能就一个节点阿
    printf("是否建立链表:");
    scanf(" %c",&c);
    while (c == 'y' || c == 'Y') {
        p = (List *)malloc(sizeof(List));   //正式开始了!首先申请一个新的节点
        scanf("%d",&p->data);            //把节点的数据放进去
        p->next = pr->next;              //插入~~
        pr->next = p;
        printf("是否建立链表:");
        scanf(" %c",&c);
    }
    return head;
}

非常简单的插入。大家在插入链表的时候可以这么插入,我写的是头插法。从头部第二个位置开始向里面添加数据,添加完的数据是倒过来的。大家可以从尾部插入数据。这样数据就是正过来的了。理解了上面的插入那么你就能人一的插入~

删除和查抄函数(放在了一起,即查找到要删除的内容之后然后删除掉):
上图删除详解:

首先三个节点:

删了中间那个废物~~

第一步让前一个指向下一个:

然后释放了P节点,就结束了

然后就完事了。

List* deleteList(List *head) {
    int e;      
    char c;
    List *p,*pr;     //永远让p指向要删除的节点,让pr指向要删除的前一个
    printf("\n是否删除节点:");   //同样的循环删除
    scanf(" %c",&c);
    while (c == 'y' || c == 'Y') {
        p = head->next,pr = head;   //查找之前让p和pr摆放好位置
        printf("请输入要删除的数据:");
        scanf("%d",&e);
        while (p) {   //查找
            if (p->data == e) {     //查找到了
                pr->next = p->next;  //图中样子删除
                free(p);   //释放
                break;
            }
            if (p->next == NULL && p->data != e) {   //没找到的处理
                printf("没找到\n");
            }
            pr = p;   //俩节点找过程中向前移动,记住保持pr是p前一个节点
            p = p->next;
        }
        printf("是否删除节点:");
        scanf(" %c",&c);
    }
    return head;
}
单链表完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值