线性表

作者: ZW0926 | 来源:发表于2020-10-12 17:07 被阅读0次

    一、顺序表

    顺序表的定义

    • 初始化顺序表
    //基本操作-初始化一个顺序表
    void InitList(SqList &L){
        for(int i=0;i<MaxSize;i++)
            L.data[i] = 0;   //将所有数据元素设置为默认初始值
        L.length = 0; //顺序表初始长度为0
    }
    
    • 如果去掉默认值的设置的步骤,则会出现“脏数据”的现象(内存中遗留的)正常情况下把各个数据元素的值设为默认值
    • 将length设置为0不可省略

    顺序表的实现(动态分配)

    //初始化
    void InitList(SeqList &L){
        //使用malloc函数申请一片连续的存储空间
        L.data = (int *)malloc(InitSize * sizeof(int));
        L.length = 0;
        L.MaxSize = InitSize;
    }
    //增加动态数据的长度
    void IncreaseSize(SeqList &L,int len){
        int *p = L.data;
        L.data = (int *)malloc((L.MaxSize+len)*sizeof(int));
        for(int i=0;i<L.length;i++){
            L.data[i] = p[i];  //将数据复制到新区域
        L.MaxSize = L.MaxSize + len;  //顺序表最大长度增加len
        free(p);    //释放原来的内存空间
    }
    

    realloc函数也可实现

    顺序表的查找

    顺序表的查找有两种方式:

    • 按位查找
    • 按值查找
      代码:
    //按位查找
    ElemType GetElem(SeqList L;int i){
        return L.data[i-1];
    }
    

    二、链表

    单链表的初始化

    单链表的建立

    • 尾插法
    • 头插法

    对应代码

    • 尾插法
    LinkList List_TailInsert(LinkList &L){  //正向建立单链表
        int x; //设置ElemType为整型
        L = (LinkList)malloc(sizeof(LNode)); //建立头节点
        LNode *s, *r=L;   //r为表尾指针
        scanf("%d",&x);
        while(x!=9999){  //输入9999表示结束
            s = (LNode *)malloc(sizeof(LNode))
            s->data = x;
            r->next = s;
            r = s;                  //r指向新的表尾结点
            scanf("%d",&x);
        }
        r->next = NULL;  //尾结点指针置空
        return L;
    }
    
    • 头插法
    LinkList List_HeadInsert(LinkList &L){  //逆向建立单链表
        LNode *s;
        int x;
        L = (LinkList)malloc(sizeof(LNode)); //建立头节点
        L->next = NULL; //初始为空链表
        scanf("%d",&x);   //输入节点的值
        while(x!=9999){  //输入9999表示结束
            s = (LNode *)malloc(sizeof(LNode)) //创建新结点
            s->data = x; 
            s->next = L->next;
            L->next = s;
            scanf("%d",&x);
        }
        return L;
    }
    

    双链表

    双链表的初始化

    //结点 double node
    typedef struct DNode{   //定义双链表结点类型
        ElemType data;      //数据域
        struct DNode *prior, *next;    //前驱和后继指针
    }DNode, *DLinkList;
    
    //初始化双链表(带头结点)
    bool InitDLinkList(DLinkList &L){
        L = (DNode *)malloc(sizeof(DNode));   ///分配一个头结点
        if (L==NULL)
            return false;
        L->prior = NULL;    //头结点的prior永远指向NULL
        L->next = NULL;    //头结点之后暂时还没有结点
        return true;
    }
    

    双链表的插入

    //在p结点之后插入s结点
    bool InsertNextDNode(DNode *p,DNode *s){
        if (p==NULL || s==NULL)   //非法参数
            return false;
        s->next = p->next;
        if (p-next != NULL)  //如果p结点有后继结点
            p->next->prior = s;
        s->prior = p;
        p->next = s;
        return true;
    }
    

    相关文章

      网友评论

          本文标题:线性表

          本文链接:https://www.haomeiwen.com/subject/wgnupktx.html