程序员

线性表顺序存储

2017-06-16  本文已影响12人  观海难水

直线属于人类,而曲线才属于上帝。

顺序表

线性表的顺序存储,用一段地址连续的存储单元依次存储线性表的数据元素。

顺序表的结构定义

typedef struct
{
    int data[MAXSIZE];   //存放顺序表元素的数组
    int length;         //存放顺序表的长度
}Sqlist;  

数组长度是存放线性表的存储空间的长度,存储分配后一般不变化。
线性表的长度是线性表种数据元素的个数,随着线性表插入和删除操作的进行而变化。
线性表的长度应该小于等于数组的长度。

C++代码实现

/**
 * Created by mapo on 2017/6/10.
 */

#include <iostream>
using namespace std;

#define MAXSIZE 20

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef struct
{
    int data[MAXSIZE];
    int length;
}Sqlist;

void InitList(Sqlist &L)//建立空线性表L
{
    L.length = 0;
}

int ListEmpty(Sqlist L)//判断线性表是否为空
{
    if (L.length == 0)
        return TRUE;
    else 
        return FALSE;
}

int ListLength(Sqlist L)//返回线性表L的元素个数
{
    return L.length;
}

int LocateElem(Sqlist L, int x)//查找线性表L中值为x返回位置
{
    int i;
    for (i = 0; i < L.length; i++)
    {
        if (x == L.data[i])
        {
            return i+1;
        }
    }
    return FALSE;
}

int GetElem(Sqlist L, int p, int &e)//用e返回线性表L中位置p的值
{
    if (L.length==0||p < 1 || p>L.length)
        return ERROR;
    e = L.data[p-1];
    return OK;
}

int ListInsert(Sqlist &L, int p, int e)//在线性表L中第p位置插入e
{
    int i;
    if (p<1 || p>L.length + 1 || L.length == MAXSIZE - 1)
        return ERROR;
    for (i = L.length; i >=p-1; i--)
        L.data[i + 1] = L.data[i];
    L.data[p-1] = e;
    L.length++;
    return OK;
}

int ListDelete(Sqlist &L, int p, int &e)//删除线性表L中第p个位置元素,并用e返回其值
{
    int i;
    if (p<1 || p>L.length)
        return ERROR;
    e = L.data[p];
    for (i = p-1; i < L.length; i++)
        L.data[i] = L.data[i + 1];
    L.length--;
    return OK;
}

int main()
{
    Sqlist list = {
        {1,2,3,4,5,6,7},
        7
    };
    int x;
    int locate;

    int search_p;
    int e;

    int insert_p;
    int value;

    int delete_p;
    int result;

    int empty;

    cout<<" \n1.遍历表中元素\n2.按元素查找表中位置 \n3.按位置查找表中元素 \n4.插入元素\n5.删除元素 \n6.线性表是否为空\n0.退出 \n请选择你的操作:\n";

    int switch_on=1;
    while (switch_on !=0)
    {
        cin >> switch_on;
        switch (switch_on)
        {
        case 1:
            cout << "遍历线性表结果:";
            for (int i = 0; i < list.length; i++)
            {
                cout << list.data[i] << " ";
            }
            cout << endl;
            break;
        case 2:
            cout << "输入要查找的元素:";
            cin >> x;
            locate = LocateElem(list, x);
            if (locate)
                cout << "元素为" << x << "是表中第" << locate << "个元素" << endl;
            else
                cout << "没有找到索要查找的值" << endl;
            break;
        case 3:
            cout << "输入要查找的位置:";
            cin >> search_p;
            GetElem(list, search_p, e);
            cout << "第" << search_p << "个位置的元素是" << e << endl;
            break;
        case 4:
            cout<<"请输入插入元素位置:";
            cin >> insert_p;
            cout<<"请输入插入元素的值:";
            cin>>value;
            ListInsert(list, insert_p, value);
            cout<<"插入完毕,现在线性表为:";
            for (int i = 0; i < list.length; i++)
            {
                cout << list.data[i] << " ";
            }
            cout << "线性表长度为:" << list.length << endl;
            break;
        case 5:
            cout << "请输入删除元素位置:";
            cin >> delete_p;
            ListDelete(list, delete_p, result);
            cout << "删除完毕,现在线性表为:";
            for (int i = 0; i < list.length; i++)
            {
                cout << list.data[i] << " ";
            }
            cout <<"线性表长度为:"<<list.length<< endl;
            break;
        case 6:
            empty = ListEmpty(list);
            if (empty)
                cout << "该线性表为空.\n";
            else
                cout << "该线性表非空\n";
            break;

        case 0:
            exit(0);
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读