zoukankan      html  css  js  c++  java
  • 线性单链表 初始化 插入 取出 头插法 合并升序排列

    #include <stdio.h>
    #include <stdlib.h>
    
    #define OK 1
    #define TRUE 1
    #define ERROR -1
    #define FALSE -1
    #define OVERFLOW -2
    #define ElemType int
    #define Status int
    //线性单链表 初始化 插入 取出 头插法 合并升序排列
    //-------------------------------线性单链表
    typedef struct LNode{ //封装一个线性单链表
        ElemType data; //数据域
        struct LNode *next; //指针域
    }LNode, *LinkList;//类型重定义struct LNode为Lnode,类型重定义 Lnode的*指针 为LinkList
    Status InitList_L(LinkList &L) {  //初始化线性链表
        L = (LinkList)malloc(sizeof(LNode)); //新开辟内存,返回指针L
        L->next = Null;//L->//对于指针p  p->a  被定义为 (*p).a   (不成文的标准)
        return TRUE;
    }
    Status GetElem_L(LinkList L,int i,ElemType &e){ //取出元素,i是序号,e为值
        //L为带头结点的单链表的头指针
        //当第i个元素存在时,将值返回给e,返回TRUE, 否则FALSE
        p = L->next; j = 1;//初始化,p指向第一个结点,j为计数器
        while (p && j<i) { //p指针非空,j计数器<i,所以循环的终点是i
            p = p->next; ++j;//指针后移一个,计数器+1一个
        }
        if (!p || j>i) return FALSE;//第i个元素不存在
        e = p->data;//取出第i个元素,值为e
        return TRUE;
    }//GetElem_L
    Status ListInsert_L(LinkList &L, int i, ElemType e) { //在带head的单链表L中第i个位置之前插入元素e    
        p = L; j = 0;//p为指针,被插入的previous Node
        while (p && j < i - 1) { p = p->next; ++j; }//寻找第i个结点,指针下移,j最后停在i
        if (!p || j>i) return FALSE;
        s = (LinkList)malloc(sizeof(LNode));//生成新节点,开辟内存空间 返回指针s,insert
        s->data = e;//s->data域的赋值 assignment
        s->next = p->next;//指针操作 ,=右往左,指针 指向 
        p->next = s;
    }
    Status ListDelete_L(LinkList &L, int i, ElemType &e) { //在带head的单链表L中第i个位置 删除元素e        
        p = L; j = 0;//p为指针,被插入的previous Node
        while (p && j < i - 1) { p = p->next; ++j; }//寻找第i个结点,下标最后是i-1,指针下移,j最后停在i
        if (p->next || j>i - 1) return FALSE;//删除位置不合理
        
        q = p->next; //q是被删除的节点    
        p->next = q->next;//P的next,指向q->next
        
        e = q->data; //取出 值为e
        free(q);//返回值,释放空间
    }
    LNode * LocateElem_L(LinkList L, ElemType e) { //在L中找到第一个值和e相同的结点,返回其地址,若不存在,返回空值NULL。
        if (!L) return NULL;
        p = L;
        while (p&&p->data != e) { p = p->next };//if(!p) p=null;
        return p;//时间复杂度O(n)
    }
    void CreateList_L(LinkList &L, int n) { //头插法 生成单链表
        //逆位序输入n个元素的值,建立带表头结点的单链线性表L
        L = (LinkList)malloc(sizeof(LNode));
        L->next = NULL;//L->next表示头结点的指针,先建立一个带头结点的单链表
        for (i = n; i > 0; --i) {
            p = (LinkList)malloc(sizeof(LNode));
            scanf(&p->data);//输入元素值
            p->next = L->next;//挪动 头指针的后继
            L->next = p;//挪动 头指针的后继
        }
    }
    void MergeList_L(LinkList &La, LinkList &Lb,) { 
        //已知La和Lb升序排列
        //合并得到新的单链表Lc,Lc的元素也按值非递减排列
        pa = La->next;
        pb = Lb->next;
        q = La;//存放临时指针,q就是pa的前驱元素,q必须始终作为pa的前驱元素
        while (pa && pb) {
            if (pa->data <= pb->data) {//如果小于=,pc指针指向pa
                q = pa;//q下移
                pa = pa->next;//pa下移
            }
            else {//如果>,pc指针指向pb
                t = pb;// t 下移
                pb = pb->next;//pb下移
                t->next = pa;//t插入pa的前面
                q->next = t;
                q = t;//q必须始终作为pa的前驱元素,因此t赋值给q
            }//2个结合起来就是小者排前面,这个代码写的真差,不是人类看的,因为C在A和B只见跳来跳去,临时pc变量拆成2个就容易理解了
        }
        if (pb) q->next = pb;
    }//MergeList_L
  • 相关阅读:
    C#listbox使用方法
    poj 3894 System Engineer (二分图最大匹配--匈牙利算法)
    Java实现 蓝桥杯VIP 算法训练 连接字符串
    Java实现 蓝桥杯VIP 算法训练 连接字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 黑白无常
  • 原文地址:https://www.cnblogs.com/blacop/p/6430420.html
Copyright © 2011-2022 走看看