顺序表】相关应用与基础操作函数【SDUT_2017_暑假

来源:互联网 发布:淘宝优惠券和满减顺序 编辑:程序博客网 时间:2024/06/07 21:55
**顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。--摘自百度百科**
#include <iostream>#include <stdio.h>#include <stdlib.h>#include <algorithm>#include <string.h>#define LISTINCREASMENT 1000   //每次再分配元素的个数#define  LISTSIZE 100000    //顺序存储的最大个数#define  OVERFLOW -1#define  OK 1using namespace std;int SeqInitial(Seqlist &L)      //初始化线性表int ListInsert(Seqlist &L, int i, int e)   //向位置i插入元素evoid ListDelete(Seqlist &L, int i, int &e)     //删除线性表中第i个位置上的元素int LocateELem(Seqlist &L, int e)    //定位元素e在顺序表中的位置int GetElem(Seqlist &L, int i)    //返回第i个位置上的元素值typedef struct        //顺序表元素定义{    int *elem;             //元素数据    int length;            //顺序表现在的长度    int listsize;              //顺序表开辟的长度}Seqlist;int SeqInitial(Seqlist &L)      //初始化线性表{    L.elem = (int *) malloc (sizeof(int) * LISTSIZE);      //为新数据开辟空间    if(!L.elem) exit(OVERFLOW);    //如果分配失败返回OVERFLOW    L.length = 0;   //顺序表长度初始化0    L.listsize = LISTSIZE;   //顺序表总长度初始化    return OK;}int ListInsert(Seqlist &L, int i, int e)   //向位置i插入元素e{    if(i < 1 || i > L.length + 1) printf("ERROR!");   //如果插入位置不合法    if(L.length >= L.listsize)    {        int *newbase = (int *) realloc (L.elem, (L.listsize + LISTINCREASMENT) * sizeof(int));        if(!newbase) return OVERFLOW;   //当前存储空间已满        L.elem = newbase;        L.listsize += LISTINCREASMENT;    //表的容量不足以分配内存    }    int *q = &(L.elem[i - 1]);     //找到前驱结点    int *p;    for(p = &(L.elem[L.length - 1]); p >= q; --p)   //依次往后移        *(p + 1) = *p;    *q = e;        //插入新数据    ++L.length;     //长度++    return OK;}void ListDelete(Seqlist &L, int i, int &e)     //删除线性表中第i个位置上的元素{    if(i < 1 || i > L.length) printf("ERROR!");    //如果删除位置不合法    else    {        e = L.elem[i - 1];           //能保存一下被删掉的值        for(; i < L.length; i++)     //从被删的数的位置开始依次后面的开始抵消前面的        {            L.elem[i - 1] = L.elem[i];        }        L.length--;    //总长度--    }}int LocateELem(Seqlist &L, int e)    //定位元素e在顺序表中的位置{    int i;    for(i = 0; i <= L.length - 1; i++)    {        if(L.elem[i] >= e)        {            break;        }    }    return i + 1;}int GetElem(Seqlist &L, int i)    //返回第i个位置上的元素值{    if(i < 1 || i > L.length) printf("ERROR!");   //如果位置不合法    else    {        return L.elem[i - 1];    }    return 0;}int main(){    Seqlist L;    int i, d, n, t;    printf("请输入顺序表的初始元素个数: ");    scanf("%d", &n);    //n个数的线性表    SeqInitial(L);     //初始化一个线性表    printf("请输入数据: ");    for(i = 1; i <= n; i++)     //输入数据    {        scanf("%d", &d);        ListInsert(L, i, d);   //i为位置    }    printf("表长: %d\n", L.length);    //输出表的长度    printf("表数据如下: ");    for(i = 1; i <= L.length; i++)     //遍历整个顺序表并输出    {        printf("%d ", L.elem[i - 1]);    }    printf("\n");    printf("请输入要删除元素的位置: ");    scanf("%d", &t);   //删除元素的位置    ListDelete(L, t, d);    printf("被删除元素的值: %d\n", d);    printf( "删除后的表:");    for(t=1; t<=L.length; t++)        printf("%d ",L.elem[t-1]);                 //删除后的表    printf("\n");    printf("请输入要插入数值的位置: ");    scanf("%d", &t);    printf("请输入要插入数值的数值: ");    scanf("%d", &d);    ListInsert(L, t, d);    printf( "插入以后的表:");    for(t=1; t<=L.length; t++)                  //插入以后的表        printf("%d ",L.elem[t-1]);    printf("\n");    printf("请输入要检索的元素的位置: ");            //检索元素    scanf("%d", &t);    d = GetElem(L, t);    printf("该元素的值为:%d\n",d);    printf("谢谢使用请挂机\n");    return 0;}
原创粉丝点击