zoukankan      html  css  js  c++  java
  • 第一节 线性表

    一.线性表

    线性表分为1.顺序线性表2.链式线性表(可包括1.循环链表2.双向链表)

    下面以代码实现:

    1.顺序线性表

    //----线性表的动态分配顺序储存结构

    #define LIST_INIT_SIZE 100 //线性表储存空间的初始分配量

    #define LISTINCREMENT 10 //线性表储存空间的分配增量

    type struct {

    Elemtype *elem;  //储存空间基地址

    int length; //当前长度

    int listsize; //当前分配的储存容量(以sizeof(Elemtype)为单位)

    }Sqlist;

    //----构造一个顺序线性表

    Status InitSqlist(Sqlist L)

    {

    if(!(L.elem = (Elemtype*)malloc(listsize*sizeof(Elemtype)))   exit(OVERFLOW);

    L.length=0;

    L.listsize=LIST_INIT_SIZE;

    return ok;

    }

    //-----顺序线性表第i个位置中增添一个元素

    Status ListInsert(Sqlist &L,int i,elemtype e)

    {

    if(i<1||i>length+1) return ERROR; //插入位置有误

    if(L.length>=L.listsize) //线性表已满,需要增加储存空间

    L.elem = (Elemtype*)realloc(L.elem,(L.listsize + LISTINCREMENT)*size of(elemtype));

    if(!L.elem) return (OVERFLOW);

    L.listsize + = LISTINCREMENT;

    }

    q=L.elem[ i-1];

    for(p=L.elem[Length -1];q<=p;--p) *(p+1)=*p;// 插入位置及之后的元素后移

    *q =e;

    ++L.length;

    return ok;

    }

    //-----顺序线性表第i个位置中删除一个元素

    Status ListDelete(Sqlist &L,int i elemtype e)

    {

    if((i<1)||(i>length)) return ERROR;

    q=L.elem[ i-1];

    e=*p;

    for(p=L.elem[Length -1];q<=p;--p) *(p-1)=*p;// 插入位置及之后的元素后移

    *q =e;

    --L.length;

    return OK;

    }

    2.链式线性表

    //----线性表法的单链表储存结构----

    typedef struct LNode

    {

    elemtype data;

    struct LNode* next;

    }LNode,*LinkList;

    //----GetElem函数----

    Status GetElem(LinkList L,int i,Elemtype e)

    {

    p=L->next; j=1;

    while(p&&j<i)

    {

    p=p->next,++j;

    }

    if(!p||j>i) return ERROR;

    e=p->data;

    return OK;

    }

    //链式线性表的增添元素

    Staus ListInsert(Linklist L,int i,elemtype e)

    {

    p=L,j=0;

    while(p&&j<i-1)

    {

    p=p->next;

    j++;

    }

    if(!p||j>i-1) return ERROR;

    s=(LinkList)malloc(sizeof(Lnode));

    s->data=e;

    s->next =p->next;

    p->next =s;

    return ok;

    }

    //链式线性表的删除元素

     Staus ListDelete(LinkList L, int i,elemtype e )

    {

    p=L,j=0;

    while(p->next&&j<i-1)

    {

    p=p->next;

    j++;

    }

    if(!(p->next)||j>i-1) return ERROR;

    e=p->data;

    q=p->next;

    p->next=q->next;//后面补给前面的

    free(q);

    return ok;

    }

    //建立线性表

    void createList(Linklist &L,int n)

    {

    L= (LinkList)malloc(sizeof(LNode));

    L_>next =null;

    for(i=n;i>0;i--)

    {

    P=(LinkList)malloc(sizeof(LNode));

    scanf(&P->data);

    p->next=L->next;

    L->next=p;

    }

    }

  • 相关阅读:
    剑指offer---第一个只出现一次的字符
    剑指offer---两个链表的第一个公共结点
    剑指offer---丑数
    剑指offer---旋转数组的最小数字
    剑指offer---滑动窗口的最大值
    剑指offer---重建二叉树
    剑指offer---数据流中的中位数
    剑指offer---二叉搜索树的第K个节点
    剑指offer--对称二叉树
    剑指offer---把二叉树打印成多行
  • 原文地址:https://www.cnblogs.com/dr-xsh/p/12441213.html
Copyright © 2011-2022 走看看