单链表的创建及其基本操作

  1. 不带头节点的单链表的创建
    #include<stdio.h>
    #include<stdlib.h>
    #include<stdbool.h>
    
    typedef struct {
        int data;
        struct LinkList* next;
    }LinkList;
    
    bool InitList(LinkList* L) {
        L = NULL;                //空表,暂时还没有任何节点
        return true;
    }
    
    //判断单链表是否为空
    bool Empty(LinkList* L) {
        return (L == NULL);
    }
    
    int main()
    {
        LinkList* L;            //声明一个指针指向单链表
        //初始化一个空表
        InitList(&L);
    
        return 0;
    }

  2. 带头结点的单链表的创建
    #include<stdio.h>
    #include<stdlib.h>
    #include<stdbool.h>
    
    typedef struct {
        int data;
        struct LinkList* next;
    }LinkList;
    
    bool InitList(LinkList* L) {
        L = (LinkList*)malloc(sizeof(LinkList));        //分配一个头节点
        if (L == NULL)
            return false;
        L->next == NULL;        //头结点之后暂时还没有节点
        return true;
    }
    
    //判断单链表是否为空(带头结点)
    bool Empty(LinkList* L) {
        if (L->next == NULL)
            return true;
        else
            return false;
    }
    
    int main()
    {
        LinkList* L;            //声明一个指针指向单链表
        //初始化一个空表
        InitList(&L);
    
        return 0;
    }

  3. 单链表的基本操作-----按位序插入(带头结点)
    //在第i个位置插入元素e(带头结点)
    bool ListInsert(LinkList* L, int i, int e) {
        if (i < 1)
            return false;
        LinkList* p;            //指针p指向当前扫描的结点
        int j = 0;                //指针p指向的是第几个结点
        p = L;                    //L是指向头结点,头结点是第0个结点(不存数据)
    
        while (p != NULL && j < i - 1) {            //循环找到第i-1个结点
            p = p->next;
            j++;
        }
        if (p == NULL)
            return false;        //i的值不合法
        LinkList* cur = (LinkList*)malloc(sizeof(LinkList));        //创建一个新的结点
        cur->data = e;
        cur->next = p->next;    //先将cur连到p的下一个结点
        p->next = cur;            //再将p连到cur,这样就把cur插入进去了
        return true;
                            
    }

  4. 单链表的基本操作-----按位序插入(不头结点)
    //在第i个位置插入元素e(不头结点)
    bool ListInsert(LinkList* L, int i, int e) {
        if (i < 1)
            return false;
        if (i == 1) {        //就是第一个结点的操作与其他的不同
            LinkList* cur = (LinkList*)malloc(sizeof(LinkList));
            cur->data = e;
            cur->next = L;
            L = cur;            //头结点指向新结点
            return true;
        }
            LinkList* p;            //指针p指向当前扫描的结点
            int j = 1;                //此处与带头结点有区别
            p = L;                    //L是指向头结点,头结点是第0个结点(不存数据)
    
        while (p != NULL && j < i - 1) {            //循环找到第i-1个结点
            p = p->next;
            j++;
        }
        if (p == NULL)
            return false;        //i的值不合法
        LinkList* cur = (LinkList*)malloc(sizeof(LinkList));        //创建一个新的结点
        cur->data = e;
        cur->next = p->next;    //先将cur连到p的下一个结点
        p->next = cur;            //再将p连到cur,这样就把cur插入进去了
        return true;
    
    }

  5. 单链表的基本操作-----指定结点的后插操作
    //后插操作:在p结点后插入元素e
    bool InsertNextNode(LinkList* p, int e) {            //时间复杂度O(1)
        if (p == NULL)
            return false;
        LinkList* cur = (LinkList*)malloc(sizeof(LinkList));
        if (cur == NULL)
            return false;        //内存分配失败
        cur->data = e;
        cur->next = p->next;
        p->next = cur;
        return true;
    }

  6. 单链表的基本操作-----指定结点的前插操作
    //前插操作:在p结点之前插入元素e
    bool InsertPriorNode(LinkList* p, int e) {
        if (p == NULL)
            return false;
        LinkList* cur = (LinkList*)malloc(sizeof(LinkList));
        if (cur == NULL)
            return false;        //内存分配失败
        //前插操作转换为后插,然后给cur和p的元素交换
        cur->data = e;
        cur->next = p->next;
        p->next = cur;
        int temp = cur->data;
        cur->data = p->data;
        p->data = temp;
        return true;
    }

  7. 单链表的基本操作-----按位序删除(带头结点)
    //按位序删除(带头结点)
    bool ListDelete(LinkList* L, int i, int* e) {
        if (i < 1)
            return false;
        LinkList* p;            //指针p指向当前扫描的结点
        int j = 0;                //指针p指向的是第几个结点
        p = L;                    //L是指向头结点,头结点是第0个结点(不存数据)
    
        while (p != NULL && j < i - 1) {            //循环找到第i-1个结点
            p = p->next;
            j++;
        }
        if (p == NULL)
            return false;        //i的值不合法
        if (p->next == NULL)
            return false;        //第i-1个结点后已无其他结点
        LinkList* cur = p->next;        //令cur指向p的next 结点
        *e = cur->data;            //获取到被删除元素的值
        p->next = cur->next;            //p再指向next的next,此时就相当于跳过了p->next这个结点,实现删除
        free(cur);                        //释放cur
        return true;
    
    }

  8. 单链表的基本操作-----指定结点的删除
    //指定结点的删除
    bool DeleteNode(LinkList* p) {
         if (p == NULL)
            return false;
        LinkList* cur = p->next;        //此处删除p结点,和前插类似,将p->next的值放到p上,再删除p->next,相当于删除了p。
        p->data = cur->data;
        p->next = cur->next;        //    此代码有个bug,就是如果p结点是最后一个结点,会报空指针异常
        free(cur);
        return true;
    }

  9. 单链表的基本操作-----按位查找(带头结点)
    //按位查找,返回第i个元素(带头结点)
    LinkList* GetElem(LinkList* L, int i) {
        if (i < 0)
            return NULL;
        LinkList* p;
        int j = 0;
        p = L;        //L指向头结点,头结点是第0个结点(不存数据)
        while (p != NULL && j < i) {
            p = p->next;
            j++;
        }
        return p;
    }

  10. 单链表的基本操作-----按值查找(带头结点)
    //按值查找,找到数据域==e的结点(带头结点)
    LinkList* LocateElem(LinkList* L, int e) {
        LinkList* p = L->next;            //从第一个结点开始查找
        while (p != NULL && p->data != e) {
            p = p->next;
        }
        return p;            //找到后返回该结点的指针,否则返回NULL
    }

  11. 单链表的基本操作-----尾插法建立单链表
    //尾插法建立单链表
    LinkList* ListTailInsert(LinkList* L) {
        int x;        //插入的类型为整型
        L = (LinkList*)malloc(sizeof(LinkList));    //建立头结点
        L->next = NULL;
        LinkList* s, * r = L;        //r为表尾指针
        scanf("%d", &x);
        while (x != 9999) {
            s = (LinkList*)malloc(sizeof(LinkList));
            s->data = x;
            r->next = s;
            r = s;            //r指向新的表尾结点
            scanf("%d", &x);
        }
        r->next = NULL;
        return L;
    }

  12. 单链表的基本操作-----头插法建立单链表(单链表的逆置)
    //头插法建立单链表
    LinkList* HeadInsert(LinkList* L) {
        LinkList* s;
        int x;
        L = (LinkList*)malloc(sizeof(LinkList));    //建立头结点
        L->next = NULL;        //初始化为空链表,得置空,有可能指向一个未知区域
        scanf("%d", &x);
        while (x != 9999) {
            s = (LinkList*)malloc(sizeof(LinkList));
            s->data = x;
            s->next = L->next;
            L->next = s;
            scanf("%d", &x);
        }
        return L;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值