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

来源:互联网 发布:钥匙包 淘宝 编辑:程序博客网 时间:2024/06/05 20:58

  顺序表:

最近一个月在学线性表,决定在国庆放假之前好好总结一下。今天,我们来总结一下线性表的知识。

首先

 什么是顺序表?

     顾名思义,顺序表就是有顺序的表,元素与元素之间为一对一的关系,除了第一个元素和最后一个元素以外都有自己的前驱和后继;

 顺序表有什么特点?

最大的特点就是其储存结构为顺序储存结构,就是把线性表中的元素按逻辑次序依次存放在一组地址连续的存储空间中

 顺序表如何操作?

利用数组的知识来解决顺序表问题;

 

1.顺序表的创建与初始化

简单明了,初始化:1.为指针分配空间

  2.将顺序表长度复制为零

  3.赋值顺序表空间大小

创建:唯一容易错的地方就是每存进一个数的时候不要忘了让其长度加一

Status InitList_Sq(SqList &L){  //初始化L为一个空的有序顺序表    L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));    if(!L.elem)exit(OVERFLOW);    L.listsize=LIST_INIT_SIZE;    L.length=0;    return OK;}
//创建
Status ListCreate_Sq(SqList &L){    L.listsize = LIST_INIT_SIZE;    L.elem = (ElemType*)malloc(sizeof(ElemType)*LIST_INIT_SIZE);    L.length = 0;    int n,i;    scanf("%d",&n);    for(i = 0; i < n; i++)    {        int a;        scanf("%d",&a);        L.elem[i] = a;        L.length++;    }    return OK;}



2.       顺序表的清空

需要注意,顺序表的清空和销毁是有区别的,清空只是让其长度为零,而销毁需要把指针分的的空间释放;


Status ClearList(List &L){    L -> length = 0;    return OK;}


3.       顺序表的销毁

Status ClearList(List &L){    free(L);    L = NULL;    L -> length = 0;    L -> ListSize = 0;}


4.       顺序表的元素插入

Status ListInsert_SortedSq(SqList &L, ElemType e){    int i,j,flag = 0;    ElemType t;    if(L.length == 0)        {            L.elem[0] = e;            L.length++;        }    else    {        for(i = 0; i < L.length; i++)        {            if(e <= L.elem[i])            {                if(L.length > L.listsize)                {                    L.listsize += 1;                    for(j = L.length - 1; j >= i; j--)                        L.elem[j + 1] = L.elem[j];                    L.elem[i] = e;                    L.length += 1;                    flag = 1;                    break;                }                else                {                    for(j = L.length - 1; j >= i; j--)                        L.elem[j + 1] = L.elem[j];                    L.elem[i] = e;                    L.length += 1;                    flag = 1;                    break;                }            }        }        if(flag == 0)        {            if(L.listsize < L.length )            {                L.listsize += 1;                L.elem[i] = e;                L.length++;            }            else            {                L.elem[i] = e;                L.length++;            }        }    }}


5.       顺序表元素的查找

int ListLocate_Sq(SqList L, ElemType e){    int i,flag = 0,place;    for(i = 0; i < L.length; i++)    {        if(L.elem[i] == e)        {            flag = 1;            place = i + 1;            break;        }    }    if(flag == 0)        return 0;    else        return place;}



6.       顺序表的就地逆置

void ListReverse_Sq(SqList &L){    int i;    ElemType t;    for(i = 0; i < L.length / 2; i++)    {        t = L.elem[i];        L.elem[i] = L.elem[L.length - 1 - i];        L.elem[L.length - 1 - i] = t;    }}


7.       集合的并交差运算

//库函数头文件包含#include<stdio.h>#include<malloc.h>#include<stdlib.h>//函数状态码定义#define TRUE        1#define FALSE       0#define OK          1#define ERROR       0#define INFEASIBLE -1#define OVERFLOW   -2typedef int  Status;//顺序表的存储结构定义#define LIST_INIT_SIZE  100#define LISTINCREMENT   10typedef int ElemType;  //假设线性表中的元素均为整型typedef struct{    ElemType* elem;   //存储空间基地址    int length;       //表中元素的个数    int listsize;     //表容量大小}SqList;    //顺序表类型定义Status InitList(SqList &L){    L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));    if(!L.elem)        exit(OVERFLOW);    L.length = 0;    L.listsize = LIST_INIT_SIZE;    return OK;}Status CreateList(SqList &L,int n){    int i,a;    for(i = 0; i < n; i++)    {        if(L.listsize < L.length)            L.listsize++;        scanf("%d",&a);        L.elem[i] = a;        L.length++;    }    return OK;}Status CopyList(SqList &L1, SqList &L2){    L2.length = L1.length;    L2.listsize = L1.listsize;    int i;    for(i = 0; i < L1.length; i++)        L2.elem[i] = L1.elem[i];    return OK;}void PrintList(SqList &L){    int i;    for(i = 0; i < L.length; i++)    {            printf(" %d",L.elem[i]);    }}Status Union(SqList &L1,SqList &L2,SqList L3){    InitList(L3);    CopyList(L1,L3);    int i,j,k;    for(i = 0; i < L2.length; i++)    {        int flag = 0;        for(j = 0; j < L3.length; j++)        {            if(L2.elem[i] == L3.elem[j])                flag = 1;        }        if(flag == 0)        {            if(L3.length > L3.listsize)                L3.listsize += 1;            L3.elem[j] = L2.elem[i];            L3.length++;        }    }    printf("%d",L3.length);    PrintList(L3);    return OK;}Status Intersection(SqList &L1,SqList &L2,SqList L3){    InitList(L3);    int i,j,k;    for(i = 0; i < L1.length; i++)    {        int flag = 0;        for(j = 0; j < L2.length; j++)        {            if(L1.elem[i] == L2.elem[j])                {                    flag = 1;                    break;                }        }        if(flag == 1)        {            if(L3.length > L3.listsize)                L3.listsize += 1;            L3.elem[L3.length] = L1.elem[i];            L3.length++;        }    }    printf("%d",L3.length);    PrintList(L3);}Status CutList(SqList &L1,SqList &L2,SqList L3){    InitList(L3);    int i,j,k;    for(i = 0; i < L1.length; i++)    {        int flag = 0;        for(j = 0; j < L2.length; j++)        {            if(L1.elem[i] == L2.elem[j])                    flag = 1;        }        if(flag == 0)        {            if(L3.length > L3.listsize)                L3.listsize += 1;            L3.elem[L3.length] = L1.elem[i];            L3.length++;        }    }    printf("%d",L3.length);    PrintList(L3);}int main(){    int a,b;    scanf("%d %d",&a,&b);    SqList L1,L2,L3;    InitList(L1);    InitList(L2);    CreateList(L1,a);    CreateList(L2,b);    Union(L1,L2,L3);    printf("\n");    Intersection(L1,L2,L3);    printf("\n");    CutList(L1,L2,L3);}


8.       顺序表的区间删除

 

//库函数头文件包含#include<stdio.h>#include<malloc.h>#include<stdlib.h>//函数状态码定义#define TRUE        1#define FALSE       0#define OK          1#define ERROR       0#define INFEASIBLE -1#define OVERFLOW   -2typedef int  Status;//顺序表的存储结构定义#define LIST_INIT_SIZE  100#define LISTINCREMENT   10typedef int ElemType;  //假设线性表中的元素均为整型typedef struct{    ElemType* elem;   //存储空间基地址    int length;       //表中元素的个数    int listsize;     //表容量大小}SqList;    //顺序表类型定义Status InitList(SqList &L){    L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));    if(!L.elem)        exit(OVERFLOW);    L.length = 0;    L.listsize = LIST_INIT_SIZE;    return OK;}Status CreateList(SqList &L,int n){    int i,a;    for(i = 0; i < n; i++)    {        if(L.listsize < L.length)            L.listsize++;        scanf("%d",&a);        L.elem[i] = a;        L.length++;    }    return OK;}void PrintList(SqList &L){    int i;    for(i = 0; i < L.length; i++)    {        if(i == 0)            printf("%d",L.elem[i]);        else            printf(" %d",L.elem[i]);    }}Status CutList(SqList &L1,SqList &L2,int min,int max){    int i;    for(i = 0; i < L1.length; i++)    {        if(L1.elem[i] > max || L1.elem[i] < min)        {            L2.elem[L2.length] = L1.elem[i];            L2.length++;        }    }    return OK;}int main(){    SqList L1,L2;    int n;    InitList(L1);    InitList(L2);    scanf("%d",&n);    CreateList(L1,n);    int min,max;    scanf("%d %d",&min,&max);    CutList(L1,L2,min,max);    PrintList(L2);}

原创粉丝点击