zoukankan      html  css  js  c++  java
  • 链表 创建 插入 删除 查找 合并

    最近学习了一下单链表的操作,将代码保存如下,供以后查看。

    链表创建:

    1.先建立一个不含数据的头指针*head,头指针的链接域为NULL。

    2.声明一个用于暂存新申请空间的指针*pc,一个用于保存创建的链表的指针*r,令*r指向*head。

    3.在循环中,为指针*pc申请空间,并给数据域赋值,head->next = pc, pc->next = NULL, head = pc。

    #define _CRT_SECURE_NO_DEPRECATE  /*取消scanf,printf不安全之类的错误提示*/
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct node
    {
        int value;
        struct node* next;
    }listnode;
    
    listnode* Creat_List1(int nodenum, int *data); //最先进去的元素在最后面
    listnode* Creat_List2(int nodenum, int *data); //最先进去的元素在最前面
    int Get_Link_Element(listnode* head, int i); //取得头指针为head的链表中的第i个元素的值(包括第0个元素)
    void Insert_List(listnode* head, int a, int i);
    void Delet_List(listnode* head, int i); //删除第i个元素
    listnode* Merge_TWO_Linklist(listnode *list1, listnode *list2);//合并两个有序链表
    
    int main()
    {
        int data;
        listnode *linka, *linkb, *linkc, *linkd, *linke;
        linka = (listnode*)malloc(sizeof(listnode));
        linkb = (listnode*)malloc(sizeof(listnode));
        linkc = (listnode*)malloc(sizeof(listnode));
        linkd = (listnode*)malloc(sizeof(listnode));
        linke = (listnode*)malloc(sizeof(listnode));
        int a[5] = { 1, 3, 5, 7, 9 };
        int b[3] = { 2,2, 4 };
        linka = Creat_List2(5, a);
        linkb = Creat_List2(3, b);
        Insert_List(linkb, 10, 1);
        Delet_List(linkb, 1);
        linkc=Merge_TWO_Linklist(linka, linkb);
        data = Get_Link_Element(linkb, 1);
        printf("%d
    ", data);
    }
    
    //新元素总是插入到头指针后面,结果就是原先的元素一直往后移
    listnode* Creat_List1(int nodenum,int *data)
    {
        listnode *pc; //保存新节点
        listnode *head;
        head = (listnode*)malloc(sizeof(listnode));
        head->next = NULL; //先建立一个带头结点的单链表
        /*开始插入元素*/
        for (int i = 0; i < nodenum; i++)
        {
            pc = (listnode*)malloc(sizeof(listnode));
            pc->value = data[i];
            pc->next = head->next;
            head->next = pc;
        }
        return head;
    }
    //新元素插入到头指针后面,头指针一直往后移
    listnode* Creat_List2(int nodenum, int *data)
    {
        listnode *pc; //保存新节点
        listnode *head;
        listnode *r;//保存产生的链表
        head = (listnode*)malloc(sizeof(listnode));
        head->next = NULL; //先建立一个带头结点的单链表
        r = head;
        /*开始插入元素*/
        for (int i = 0; i < nodenum; i++)
        {
            pc = (listnode*)malloc(sizeof(listnode));
            pc->value = data[i];
            head->next = pc;
            pc->next = NULL;
            head = pc;
        }
        return r;
    }
    
    //取得头指针为head的链表中的第i个元素的值(包括第0个元素)
    int Get_Link_Element(listnode* head, int i)
    {
        /*创建一个扫描指针,让它指向第一个元素*/
        listnode* pc;
        int j = 0; //计数
        pc = (listnode*)malloc(sizeof(listnode));
        pc = head->next;
        while (pc != NULL && j < i) //遍历
        {
            pc = pc->next;
            j++;
        }
        if (pc == NULL || j > i) exit(-1);
        return pc->value;
    }
    
    /*
    *合并两个有序链表,把list2合并到list1
    */
    listnode* Merge_TWO_Linklist(listnode *list1, listnode *list2)
    {
        listnode *pc1, *pc2, *pc3,*list3;
        pc1 = (listnode*)malloc(sizeof(listnode));
        pc2 = (listnode*)malloc(sizeof(listnode));
        pc3 = (listnode*)malloc(sizeof(listnode));
    
    
        pc1 = list1->next;
        pc2 = list2->next;
        pc3 = list1;
        list3 = pc3;
        while (pc1 != NULL && pc2 != NULL)
        {
            if (pc1->value <= pc2->value) {
                pc3->next = pc1;
                pc3 = pc3->next;
                pc1 = pc1->next;
            }
            else{
                pc3->next = pc2;
                pc3 = pc3->next;
                pc2 = pc2->next;
            }
        }
        if (pc1 == NULL) pc3->next = pc2;
        if (pc2 == NULL) pc3->next = pc1;
        free(list2);
        return list3;
    }
    
    void Insert_List(listnode* head, int a, int i)
    {
        listnode *pc;
        listnode *s;
        pc = head->next;//令pc指向第一个元素
        int j = 1;
        while (pc != NULL && j < i)
        {
            pc = pc->next; //pc后移动
            j++;
        }
        if (pc == NULL)
        {
            printf("error
    ");
            exit(-1);
        }
    
        s = (listnode*)malloc(sizeof(listnode));
        s->value = a;
        s->next = pc->next;
        pc->next = s;
    }
    
    //删除第i个元素
    void Delet_List(listnode* head, int i)
    {
        listnode *temp = NULL;
        int j = 1; //计数
        head = head->next;
        while (head != NULL && j < i)
        {
            head = head->next;
            j++;
        }
        if (head == NULL)
        {
            printf("error
    ");
            exit(-1);
        }
        temp = head->next;
        head->next = temp->next;
        //head = head->next->next;
        free(temp);
    }
    View Code
  • 相关阅读:
    vim/gvim使用笔记
    WebStorm for Mac (PyCharm)- 破解注册激活版下载
    volatile 关键字
    vue页面在加载的时候闪烁花括号{{}} 解决非工程化项目初始化页面闪动问题
    Element-ui el-table表格 排序图标刷新后不见问题
    与运算(&)、或运算(|)、异或运算(^)
    JS中 二进制与十进制的相互转换
    报告大家好消息,我找到新工作了
    公众号基本配置 token 验证失败,成功解决
    asp.net core 5.0,怎么山寨了koa2?
  • 原文地址:https://www.cnblogs.com/mrethan/p/4110099.html
Copyright © 2011-2022 走看看