线性表

作者: 百合_b06b | 来源:发表于2018-11-04 23:50 被阅读0次

顺序表的存储结构与实现:

#include<stdlib.h>

#include<stdio.h>

typedef int ElemType;

typedef struct

{

    int n;                //顺序表的长度

    int maxLength;        //顺序表的最大允许长度

    ElemType *element;    //ElemType是自定义类型,指针element指示顺序表的存储空间的首地址

} SeqList;                //SeqList是类型名,可通过它定义相应变量

#define ERROR 0

#define OK 1

#define Overflow 2        //Overflow表示上溢

#define Underflow 3        //Underflow表示下溢

#define NotPresent 4    //NotPresent表示元素不存在

#define Duplicate 5        //Duplicate表示有重复元素

typedef int Status;        //返回值类型Status为整型

//顺序表的初始化

Status Init(SeqList *L, int mSize)

{

    L->maxLength = mSize;

    L->n = 0;

    L->element = malloc(sizeof(ElemType)*mSize);        //动态生成一维数组空间        malloc:动态分配内存空间的函数

    if (!L->element)

        return ERROR;

    return OK;

}

//查找

Status Find(SeqList L, int i, ElemType *x)

{

    if (i<0 || i>L.n-1)            //判断元素下标i是否越界

        return ERROR;

    *x = L.element[i];            //取出element[i]的值通过参数x返回

    return OK;

}

//插入

Status Insert(SeqList *L, int i, ElemType x)

{

    int j;

    if (i<-1 || i>L->n - 1)        //判断元素下标i是否越界

        return ERROR;

    if (L->n == L->maxLength)        //判断顺序表存储空间是否已满

        return ERROR;

    for (j = L->n-1; j > i; j--)

        L->element[j+1] = L->element[j];    //从后往前逐个后移元素

    L->element[i+1] = x;                    //将新元素放入下标为i+1的位置

    L->n = L->n +1;                            //说明表长度为n+1

    return OK;

}

//删除

Status Delete(SeqList *L, int i)

{

    int j;

    if (i<0 || i> L->n - 1)                //判断元素下标i是否越界

        return ERROR;

    if (!L->n)                            //判断顺序表存储空间是否为空

        return ERROR;

    for (j = i + 1; j < L->n; j++)

        L->element[j - 1] = L->element[j];        //从前往后逐个前移元素

    L->n --;                                    //表长减1

    return OK;

}

//输出

Status Output(SeqList L)

{

    int i;

    if (!L.n)                    //判断顺序表存储空间是否为空

        return ERROR;

    for (i = 0; i <= L.n - 1; i++)

        printf("%d", L.element[i]);                //从前往后逐个前移元素

    printf("\n");

    return OK;

}

//撤销:释放初始化运算中动态分配的数据元素存储空间,以防止内存泄漏

void Destroy(SeqList *L)

{

    (*L).n = 0;

    (*L).maxLength = 0;

    free((*L).element);            //free:释放内存区,使这部分内存被其他变量使用,无返回值

}

void main()

{

    int i;

    SeqList list;

    Init(&list, 10);            //对线性表的初始化

    for (i = 0; i < 9; i++)

        Insert(&list, i - 1, i);    //对线性表中插入新元素    --在a[0]中插入0,依次循环

    printf("输出插入线性表的元素:\n");

    Output(list);

    Delete(&list, 0);        //删除线性表元素a[0],

    printf("输出经删除操作线性表的元素:\n");

    Output(list);

    Destroy(&list);

    printf("输出经清空操作线性表的元素:\n");

    Output(list);

}

单链表的存储与实现(不带表头结点):

#include<stdlib.h>

#include<stdio.h>

typedef int ElemType;

typedef struct Node

{

    ElemType element;        //结点的数据域

    struct Node *link;        //结点的指针域,存放后继结点的地址

} Node;

typedef struct

{

    struct Node * first;    //头指针

    int n;                    //单链表中元素的个数

} SingleList;                //singleList是单链表类型

#define ERROR 0

#define OK 1

#define Overflow 2        //Overflow表示上溢

#define Underflow 3        //Underflow表示下溢

#define NotPresent 4    //NotPresent表示元素不存在

#define Duplicate 5        //Duplicate表示有重复元素

typedef int Status;        //返回值类型Status为整型

//初始化:单链表初始化运算是构造一个空的单链表

Status Init(SingleList *L)

{

    L->first = NULL;

    L->n = 0;

    return OK;

}

//查找:单链表不具备顺序表的可随机存储元素的特性,必须沿着单链表的头结点开始逐个计数进行查找

Status Find(SingleList L, int i, ElemType *x)

{

    Node *p;

    int j;

    if (i < 0 || i>L.n - 1)            //判断i是否越界

        return ERROR;

    p = L.first;

    for (j = 0; j < i; j++)            //从头结点开始查找ai

        p = p->link;

    *x = p->element;                //通过x返回ai的值

    return OK;

}

//单链表的插入

Status Insert(SingleList *L, int i, ElemType x)

{

    Node *p, *q;

    int j;

    if (i<-1 || i>L->n - 1)            //判断i是否越界

        return ERROR;

    p = L->first;

    for (j = 0; j < i; j++)            //从头结点开始查找ai

        p = p->link;

    q = malloc(sizeof(Node));        //生成新结点q

    q->element = x;

    if (i>-1)

    {

        q->link = p->link;            //新结点插在p所指结点之后

        p->link = q;

    }

    else

    {

        q->link = L->first;            //新结点插在头结点之前,成为新的头结点

        L->first = q;

    }

    L->n++;

    return OK;

}

//单链表的删除

Status Delete(SingleList *L, int i)

{

    int j;

    Node *p, *q;

    if (!L->n)                    //判断是否为空

        return ERROR;

     if (i<-1 || i>L->n - 1)            //判断i是否越界

        return ERROR;

    q = L->first;

    p = L->first;

    for (j = 0; j < i - 1; j++)

        q = q->link;

    if (i == 0)

        L->first = L->first->link;        //删除的是头结点

    else

    {

        p = q->link;                    //p指向ai

        q->link = p->link;                //从单链表中删除p所指向的结点

    }

    free(p);                    //释放p所指结点的存储空间

    L->n--;

    return OK;

}

//输出

Status Output(SingleList L)

{

    Node *p;

    if (!L.n)                    //判断是否为空

        return ERROR;

    p = L.first;

    while (p)

    {

        printf("%d", p->element);

        p = p->link;

    }

    return OK;

}

//撤销

void Destroy(SingleList *L)

{

    Node *p;

    while (L->first)

    {

        p = L->first->link;            //保存后继结点地址,防止“断链”

        free(L->first);                //释放first所指结点的存储空间

        L->first = p;

    }

}

void main()

{

    int i;

    int x;

    SingleList list;

    Init(&list);       //初始化带表头的单链表

    for (i = 0; i < 9; i++)

        Insert(&list, i - 1, i);        //将0-8依次插入单链表

    printf("the linklist is:");

    Output(list);                    //输出单链表元素

    Find(list, 0, &x);                //查找a0元素,通过x输出

    printf("\nthe linklist is:");

    printf("%d\n",x);

 Delete(&list, 0);         //删除表头元素

 printf("删除后表中的元素为:");

 Output(list);         //删除后输出表中元素

    Destroy(&list);

}

带表头结点的单链表

#include<stdlib.h>

#include<stdio.h>

#defineERROR0

#defineOK1

#defineOverflow2       //Overflow表示上溢

#defineUnderflow3      //Underflow表示下溢

#defineNotPresent4     //NotPresent表示元素不存在

#defineDuplicate5      //Duplicate表示有重复元素

typedefintElemType;         // 将 整型 int 关键字 重新命名为 Elemtype

typedefintStatus;           // 将 整型 int 关键字 重新命名为 Status

typedefstructNode

{

        ElemTypeelement;             //结点的数据域

        structNode*link;            //结点的指针域,存放后继结点的地址

}Node;

typedefstruct

{

        structNode*head;            //表头结点

        intn;                       //单链表中元素的个数

}HeaderList;

//初始化:构造一个仅带有一个表头结点的空的单链表

StatusInit(HeaderList*h)

{

        h->head = (Node*)malloc(sizeof(Node));               //生成表头结点

        if(!h->head)

               returnERROR;

        h->head->link =NULL;         //设置单链表为空表

        h->n = 0;

        returnOK;

}

//插入

StatusInsert(HeaderList*h,inti,ElemTypex)

{

        Node*p, *q;

        if(i< -1 ||i>h->n - 1)          //判断i是否越界

               returnERROR;

        p =h->head;

        for(intj = 0; j <=i; j++)          //从头结点开始查找ai

               p = p->link;

        q =(Node*) malloc(sizeof(Node));        //生成新结点q

        //带表头结点的单链表每个结点之前都有前驱结点,所以不需要再考虑单独处理插入在头结点之前的情况

        q->element =x;

        q->link = p ->link;

        p->link = q;

        h->n++;

        returnOK;

}

//删除

StatusDelete(HeaderList*h,inti)

{

        intj;

        Node*p, *q;

        if(!h->n)                 //判断是否为空

               returnERROR;

        if(i<0||i>h->n - 1)          //判断i是否越界

               returnERROR;

        //带表头结点的单链表每个结点之前都有前驱结点,所以不需要再考虑单独处理删除头结点之前的情况

        q =h->head;

        for(j = 0; j <i; j++)

               q = q->link;

        p = q->link;                 //p指向ai

        q->link = p->link;              //从单链表中删除p所指结点

        free(p);                                     //释放p所指结点的存储空间

        h->n--;

        returnOK;

}

//查找

StatusFind(HeaderListh,inti,ElemType*x)

{

        Node*p;

        intj;

        if(i<0 ||i>h.n - 1)           //判断i是否越界

               returnERROR;

        p =h.head->link;

        for(j = 0; j <i; j++)           //从头结点开始查找ai

               p = p->link;

        *x= p->element;              //通过x返回ai的值

        returnOK;

}

/*方法2:

//查找

Status Find(HeaderList L,int i,ElemType *x)

{

        Node *p,*q;

        int j;

        if(i<0||i>L.n-1)

               return ERROR;

        p=L.head;

        for(j=0;j<i;j++)

               p=p->link;

        q=p->link;

        *x=q->element;

        return OK;

}

*/

//输出

StatusOutput(HeaderListh)

{

        Node*p;

        if(!h.n)                 //判断是否为空

               returnERROR;

        p =h.head->link;

        while(p)

        {

               printf("%d", p->element);

               p = p->link;

        }

        returnOK;

}

/*方法2:

//输出

Status Output(HeaderList L)

{

        Node *p,*q;

        if(!L.n)

               return ERROR;

        p=L.head;

        q=p->link;

        while(q)

        {

               printf("%d",q->element);

               q=q->link;

        }

        return OK;

}

*/

//撤销

voidDestroy(HeaderList*h)

{

        Node*p;

        while(h->head)

        {

               p =h->head->link;           //保存后继结点地址,防止“断链”

               free(h->head);              //释放head所指结点的存储空间

               h->head = p;

        }

}

//主函数

voidmain()

{

        inti;

        intx;

        HeaderListlist;

        Init(&list);      //初始化带表头的单链表

        for(i = 0; i < 9;i++)

               Insert(&list,i-1,i);       //为单链表赋值 将0-8依次插入单链表

        printf("该单链表的元素为:");

        Output(list);                  //输出单链表元素

        Delete(&list, 0);                            //删除头结点a0元素

        printf("\n删除后表中的元素为:");

        Output(list);        //删除后输出表中元素

        Find(list, 0, &x);       //查找表头元素

        printf("\n表头元素为:");

        printf("%d\n", x);

        Destroy(&list);

}

相关文章

  • 线性表的相关操作

    集合 --- 创建线性表 解散 --- 销毁线性表 长度 --- 得到线性表的长度 出列 --- 从线性表删除一个...

  • [数据结构]第二章线性表(1)——线性表

    线性表 线性表的基本概念 线性表的定义 线性表是具有相同数据类型的n(n>=0)个元素的有限序列。 线性表的基本操...

  • 数据结构与算法(二)

    线性表及其顺序存储结构 线性表的基本概念 线性结构又称为线性表,线性表是最简单也是最常用的一种数据结构。 线性表的...

  • 线性表及应用

    线性表 “线性表(List):零个或多个数据元素的有限序列。” 线性表的顺序存储结构 线性表的顺序存储结构,指的是...

  • 数据结构03-线性表之顺序表

    第三章 线性表之顺序表 第三章 线性表之顺序表一、什么是线性表?1> 概念2> 线性表的基本操作二、线性表的顺序存...

  • 数据结构之线性表

    1、线性表-顺序表线性表-顺序表

  • 线性表数据结构

    线性表 线性表就是数据排成像一条线的结构,每个线性表上的数据最多只有前和后两个方向。与线性表对立的是非线性表,如二...

  • 大话数据结构 - 线性表

    代码GitHub地址 线性表 线性表需要相同的数据类型 线性表的处理方式都是先取代,后目的。比如删除链式线性表的某...

  • 数据结构-线性表(顺序表和链表)

    大纲:理解线性表的逻辑结构掌握线性表的顺序存贮结构和链式存贮结构;掌握线性表基本操作的实现。了解线性表的应用。 线...

  • 数据结构 线性表 单链表 c语言实现可运行

    线性表 线性表概念 线性表定义:具有相同特性数据元素的有限序列。线性表的逻辑结构:线性结构。只有一个表头,只有一个...

网友评论

      本文标题:线性表

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