线性单链表 初始化 插入 取出 头插法 合并升序排列

#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

 

posted @ 2017-02-22 18:35  影落明湖  阅读(489)  评论(0编辑  收藏  举报