顺序表的创建;往顺序表的指定位置插入元素;从顺序表的指定位置删除元素

顺序表的存储结构如下:

typedef struct
{
    ElemType *elem;

    int length;

    int listsize;

}SqList;

顺序表的初始化如下:

void InitList_Sq(SqList &L)
{
    //构造一个空的线性表L

    L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));

    //LIST_INIT_SIZE表示顺序表所能容纳元素的个数

    if(!L.elem)
    {
        exit(1); //存储分配失败
    }
    L.length = 0;   //空表长度为0

    L.listsize = LIST_INIT_SIZE;    //初始存储容量

}

创建顺序表如下:根据提示输入要创建的顺序表的元素个数,再根据提示输入每个元素的值。

void Creat_Sq(SqList &L)
{
    int i,n;

    cout<<"请输入顺序表的元素个数:";

    cin>>n;

    for(i=0;i<n;i++)
    {
        cout<<"请输入第 "<<(i+1)<<" 个元素:";

        cin>>L.elem[i];

        L.length++;
    }
}

输出顺序表中的元素:

void Show_Sq(SqList L)
{
    for(int i=0;i<L.length;i++)
    {
        cout<<L.elem[i]<<" ";
    }

    cout<<endl;
}

向顺序表的指定位置插入元素:

void ListInsert_Sq(SqList &L,int i,ElemType e)
{
    if(i<1||i>L.length+1)
    {
        cout<<"i值不合法"<<endl;
    }

    if(L.length>=L.listsize)
    {
       newbase = (ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));

        if(!newbase)exit(OVERFLOW);

        L.elem = newbase;

        L.listsize += LISTINCREMENT;
    }

    q = &(L.elem[i-1]);

    for(p = &(L.elem[L.length-1]);p>=q;--p)
    {
        *(p+1) = *p;
    }

    *q = e;

    ++L.length;
}

删除顺序表指定位置元素:

void ListDel_Sq(SqList &L,int i,ElemType e)
{
    if(i<1||i>L.length+1)
    {
        cout<<"i值不合法"<<endl;

    }
   
    q = &(L.elem[L.length-1]);

    for(p=&(L.elem[i-1]);p<=q;p++)
    {
        *p=*(p+1);
    }

    e=*q;

    --L.length;
}

更新顺序表指定位置元素的值: 

void ListUpdate_Sq(SqList &L,int i,ElemType e)
{
    if(i<1||i>L.length+1)
    {
        cout<<"i值不合法"<<endl;
    }

    L.elem[i-1] = e;
}

 完整版代码如下:注意函数返回值有做修改


#include <iostream>

#include <stdio.h>

#include <stdlib.h>

using namespace std;

typedef int ElemType;

typedef int Status;

#define OK 1

#define ERROR 0

#define OVERFLOW -2

#define LIST_INIT_SIZE 100

#define LISTINCREMENT 10

ElemType * newbase,*p,*q;

//顺序表的结构描述

typedef struct{

    ElemType *elem;

    int length;

    int listsize;

}SqList;

//顺序表的初始化

Status InitList_Sq(SqList &L){

    //构造一个空的线性表L

    L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));

    if(!L.elem)exit(OVERFLOW); //存储分配失败

    L.length = 0;   //空表长度为0

    L.listsize = LIST_INIT_SIZE;    //初始存储容量

    return OK;

}//InitList_Sq

//顺序表的建立

void Creat_Sq(SqList &L){

    int i,n;

    cout<<"请输入顺序表的元素个数:";

    cin>>n;

    for(i=0;i<n;i++){

        cout<<"请输入第 "<<(i+1)<<" 个元素:";

        cin>>L.elem[i];

        L.length++;

    }

}

//顺序表的显示

void Show_Sq(SqList L){

    for(int i=0;i<L.length;i++){

        cout<<L.elem[i]<<" ";

    }

    cout<<endl;

}

//顺序表的插入

Status ListInsert_Sq(SqList &L,int i,ElemType e){

    if(i<1||i>L.length+1){

        cout<<"i值不合法"<<endl;

        return ERROR;

    }

    if(L.length>=L.listsize){

        newbase = (ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));

        if(!newbase)exit(OVERFLOW);

        L.elem = newbase;

        L.listsize += LISTINCREMENT;

    }

    q = &(L.elem[i-1]);

    for(p = &(L.elem[L.length-1]);p>=q;--p){

        *(p+1) = *p;

    }

    *q = e;

    ++L.length;

    return OK;

}

//顺序表的删除

Status ListDel_Sq(SqList &L,int i,ElemType e){

    if(i<1||i>L.length+1){

        cout<<"i值不合法"<<endl;

        return ERROR;

    }

    q = &(L.elem[L.length-1]);

    for(p=&(L.elem[i-1]);p<=q;p++){

        *p=*(p+1);

    }

    e=*q;

    --L.length;

    return OK;

}

//顺序表的修改

Status ListUpdate_Sq(SqList &L,int i,ElemType e){

    if(i<1||i>L.length+1){

        cout<<"i值不合法"<<endl;

        return ERROR;

    }

    L.elem[i-1] = e;

    return OK;

}


int ListLocate_Sq(SqList L, ElemType e)

{

    int a = -1;//给a赋初值,无论查找的数据在第几个,都不可能是第-1个,所以赋值-1

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

    {

        if(L.elem[i] == e)

        {

            a = i;

            break;

        }

    }//for循环进行查找

    if(a >= 0&&a <= L.length -1)

        return a + 1;//如果a的值满足要求,则返回a

    else

        return ERROR;//如果a不满足,则返回错误。

}



int GetElem_Sq(SqList L,int i)

{  if(i>L.length||i<=0)
      
	cout<<"输入非法"<<endl;
   
   else
    return L.elem[i-1];
   

}


int Length_Sq(SqList L)
{
	return L.length;
}
bool Empty_Sq(SqList L)
{
	
	if(L.length==0)
	return true;
	else 
	return false;
}

int main()

{

    SqList L;

    InitList_Sq(L);

    Creat_Sq(L);

    Show_Sq(L);

    int num=0,i;

    ElemType e;

    bool flag = true;

    while(flag){

        cout<<"1.插入 "<<"2.删除 "<<"3.修改 "<<"4.返回指定元素所在的位置"<<"5.返回指定位置元素的值"<<"6.返回顺序表的长度"<<"7.判断线性表是否为空"<<endl;

        cout<<"请输入要执行操作的序号:";

        cin>>num;

        if(num>=1&&num<=7){

            flag=false;

        }else{

            cout<<"输入非法"<<endl;

        }

    }

    switch(num){
        case 1 :
		{
            cout<<"请输入要插入的位置:";
            cin>>i;
            cout<<"请输入要插入的数:";
            cin>>e;
            ListInsert_Sq(L,i,e);
        }break;

        case 2 :
		{
            cout<<"请输入要删除的位置:";
            cin>>i;
            ListDel_Sq(L,i,e);
        }break;
        case 3 :
		{
            cout<<"请输入要修改的位置:";
            cin>>i;
            cout<<"请输入修改成的数:";
            cin>>e;
            ListUpdate_Sq(L,i,e);
        }break;
        case 4 :
		{
			cout<<"请输入元素值:";
			cin>>i;
            cout<<ListLocate_Sq(L,i)<<endl; 
		}break;
        case 5 :
		{
            cout<<"请输入位置值:";
            cin>>i;
            cout<< GetElem_Sq(L,i)<<endl;
        }break;
        case 6 :
		{
            cout<<Length_Sq(L)<<endl; 
        }break;
         case 7 :
		{
            cout<<Empty_Sq(L)<<endl; 
        }break;

    }
    Show_Sq(L);
    return 0;

}

 

  • 11
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值