数据结构与算法——线性表的顺序表示

// 顺序表的创建以及增删改函数的实现.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
#include<process.h>
using namespace std;

void ErrorMessage()   //出错信息处理函数
{
    cout<<"对不起,您输入的值不符,请重新运程序"<<endl;
    exit(1);
}

const int LIST_INIT_SIZE=100;    //初始分配最大空间
const int LISTINCREMANT=10;       //增补空间量

 struct SqList{
    int *elem;              //存储数据元素的一维数组
    int length;              //长度线性表的当前
    int listsize;            //当前分配的数组容量
    int incrementsize;       //约定的增补空间量
};

void InitList_sq (SqList &L)        //构造一个空线性表
{
    L.elem=new int[LIST_INIT_SIZE];   //分配一个最大容量为100的空间
    L.length=0;                       //当前元素个数为0
    L.listsize=LIST_INIT_SIZE;   //该顺序表可以容纳100个数据元素
    L.incrementsize=LISTINCREMANT;//需要时每次可以扩充10个元素空间
}

int LocateElem_sq(SqList L,int e){  //查找元素操作
    int i=1;                             //i的初值为第一个元素的位序
    int *p=L.elem;                      //指针p指向线性表第一个元素的地址
    while(i<=L.length && *p++!=e)++i;   
    if(i<=L.length) return i;
    else return 0;
}

void increase(SqList &L)     //顺序表追加空间
{
    int *a;
    a=new int[L.incrementsize+L.listsize];           //a为临时过渡的辅助数组    
    for(int i=0;i<L.length;i++)a[i]=L.elem[i];       //腾出原空间数据
    delete[]L.elem;                                 //释放数据元素所占原空间首L.elem
    L.elem=a;                                       //移交空间首地址
    L.listsize+=L.incrementsize;                   //扩容后的顺序表的最大空间
}

void ListInsert_sq(SqList &L,int i,int e)   //插入元素
{
    if(i<1||i>L.length+1) ErrorMessage() ; //插入位置在第一个之前或是在最后加一之后则不合法
    if(L.length>=L.listsize) increase(L);                    //若当前的存储空间已满,则增加分配空间        
    int *q=&(L.elem[i]);                         //指针q指向线性表第i-1个数
    for(int *p=&(L.elem[L.length-1]);p>=q;--p)*(p+1)=*p;     //插入位置及之后的元素又移一位
    *q=e;                                              //插入e
    ++L.length;                                        //表长增加1
}

void DestroyList_sq(SqList &L)          //销毁顺序表L所占空间
{
    //释放顺序表L所占存储空间
    delete[] L.elem;
    L.listsize=0;
    L.length=0;
}

void Listdelete_sq(SqList &L,int i,int &e)  //删除元素操作
{
    //在顺序表L中删除第i个元素,并用e返回其值
    //i的合法值为1<=i<=L.length
    if(i<1||i>L.length)ErrorMessage();
    int *p=&(L.elem[i-1]);
    e=*p;
    int *q=L.elem+L.length-1;
    for(++p;p<=q;++p)*(p-1)=*p;
    --L.length;
}

int _tmain(int argc, _TCHAR* argv[])
{
    SqList s;
    InitList_sq(s);
    int n;
    cout<<"请输入线性表s的长度length:";
    cin>>n;
    cout<<"请输入线性表的"<<n<<"个数"<<endl;
    for(int i=0;i<n;i++)
    cin>>s.elem[i];
    s.length=n;
    //查找
    int x;
    cout<<"请输入你要查找的数值:";
    cin>>x;
    cout<<LocateElem_sq(s,x)<<endl;
    //插入
    int a,b;
    cout<<"请分别输入要插入的位置和数:";
    cin>>a;
    cin>>b;
    ListInsert_sq(s,a,b);
    for(int i=0;i<n+1;i++ )
    cout<<s.elem[i]<<" ";
    cout<<endl;
    increase(s);
    cout<<"请输入要删除数的位置"<<endl;
    int i,k;
    cin>>i;
    Listdelete_sq(s,i,k);
    cout<<"你删除的数是"<<k<<endl;
    DestroyList_sq(s);
    return 0;
}

 

posted on 2013-03-20 15:51  之足常乐  阅读(254)  评论(0)    收藏  举报

导航