zoukankan      html  css  js  c++  java
  • 单链线性表的实现

    //函数结果状态代码
    
    
    #define    TRUE    1
    #define    FALSE    0
    #define    OK        1
    #define    ERROR    0
    #define    INFEASIBLE    -1
    #define    OVERFLOW    -2
    //Status是函数的类型,其值是函数结果状态代码
    typedef int Status;
    typedef int ElemType;
    
    typedef struct LNode{
        ElemType        data;
        struct LNode    *next;
    }LNode,*LinkList;
    
    Status GetElem_L(LinkList L,int i,ElemType &e){
        //L为带头结点的单链表的头指针。
        //当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
        LNode *p;
        int j;
        p=L->next;j=1;        //初始化,p指向第一个结点,j为计数器
        while(p && j<i){        //顺指针向后查找,直到p指向第i个元素或p为空
            p=p->next;++j;
        }
        if(!p || j>i)    return ERROR;    //第i个元素不存在
        e=p->data;            //取第i个元素
        return OK;
    }//GetElem_L
    
    Status ListInsert_L(LinkList &L,int i,ElemType e){
        //在带头结点的单链线性表L中第i个位置之前插入元素e
        LinkList p,s;
        int j;
        p=L; j=0;
        while(p && j<i-1){    //寻找第i-1个结点
            p=p->next;++j;
        }
        if(!p || j>i-1)    return ERROR;    //i小于1或者大于表长加1
        s=(LinkList)malloc(sizeof(LNode));    //生成新结点
        s->data=e;s->next=p->next;        //插入L中
        p->next=s;
        return OK;
    }//ListInsert_L
    
    Status ListDelete_L(LinkList &L,int i,ElemType e){
        //在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
        LinkList p,q;
        int j;
        p=L; j=0;
        while(p->next && j<i-1){    //寻找第i个结点,并令p指向其前趋
            p=p->next;++j;
        }
        if(!(p->next) || j>i-1)    return ERROR;    //删除位置不合理
        q=p->next;p->next=q->next;                //删除并释放结点
        e=q->data;free(q);
        return OK;
    }//ListInsert_L
    
    void CreateList_L(LinkList &L,int n){
        //逆位序输入n个元素的值,建立带表头结点的单链线性表L。
        int i;
        LinkList p;
        L=(LinkList)malloc(sizeof(LNode));
        L->next=NULL;        //先建立一个带头结点的单链表
        for(i=n;i>0;--i){
            p=(LinkList)malloc(sizeof(LNode));        //生成新结点
            scanf("%d",&p->data);                        //输入元素值
            p->next=L->next;L->next=p;                //插入到表头
        }
    
    }//CreateList_L
    
    void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc){
        //已至单链线性表La和Lb的元素按值非递减排序
        //归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排序。
        LinkList pa,pb,pc;
        pa=La->next;pb=Lb->next;
        Lc=pc=La;            //用La的头结点作为Lc的头结点
        while(pa && pb){
            if(pa->data<=pb->data){
                pc->next=pa;pc=pa;pa=pa->next;
            }else{
                pc->next=pb;pc=pb;pb=pb->next;
            }
        }
        pc->next=pa?pa:pb;            //插入剩余段
        free(Lb);                    //释放Lb的头结点
    }//MergeList_L
    #include "stdafx.h"
    #include "stdlib.h"
    #include "stdio.h"
    #include "malloc.h"
    #include "LinkList.h"
    
    int main(int argc, char* argv[])
    {
        LinkList L;
        ElemType e;
        ElemType in;
        int n;
        n=5;
        CreateList_L(L,5);
        GetElem_L(L,n,e);
        printf("GetElem %d: %d ",n,e);
    
        in=6;
        ListInsert_L(L,5,in);
        GetElem_L(L,n,e);
        printf("GetElem %d: %d ",n,e);
        return 0;
    }
  • 相关阅读:
    INSPIRED启示录 读书笔记
    INSPIRED启示录 读书笔记
    INSPIRED启示录 读书笔记
    INSPIRED启示录 读书笔记
    dialog窗口也能刷新
    js验证数字及操作备份
    工具类
    查询结果设置背景色
    decmain主体类经典保存备份
    jquery操作备份
  • 原文地址:https://www.cnblogs.com/13yan/p/3417150.html
Copyright © 2011-2022 走看看