数据结构实验--顺序表操作

记录一下:

数据结构实验。

#include <stdio.h>
#include <string.h>
#include <algorithm>
#define LIST_INIT_SIZE 80 // 线性表存储空间的初始分配量
#define LISTINCREMENT 10 // 线性表存储空间的分配增量

using namespace std;

typedef int Status;
typedef int ElemType;

//创建顺序表
typedef struct{
    int *Elem;// 存储空间基址,使用相当于数组
    int Length;// 当前长度
    int ListSize;// 当前分配的存储容量
}Sqlist;

//采用冒泡排序对线性表进行升序排列
void Sort(Sqlist &L)
{
    int n=L.Length;
    for(int i=0;i<n;i++){
        for(int j=0;j<i;j++){
            if(L.Elem[i]<L.Elem[j]){ //每次进行对比
                int t=L.Elem[i];
                L.Elem[i]=L.Elem[j];
                L.Elem[j]=t;
            }
        }
    }
}

//初始化顺序表
Status InitList(Sqlist &L)
{
    L.Elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));//动态分配空间
    if(!L.Elem) exit(-1); //空间分配不成功,退出
    L.Length=0;//顺序表当前长度为0
    L.ListSize=LIST_INIT_SIZE;// 当前分配的存储容量,相当于数组的大小
    return 1;
}

//查找顺序表中第i个元素,并将值保存
Status GetElem(Sqlist L,int i,ElemType &e)
{
    if(i<1||i>L.Length) return 0;
    e=L.Elem[i-1];//将值保存在e中
    return 1;
}

//查找元素e在第几个位置
Status LocateELem(Sqlist L,ElemType e)
{
    for (int i=0;i<L.Length;i++)
        if (L.Elem[i]==e) return i+1;//找到元素,返回元素位置
    return 0;
}

Status ListInsert(Sqlist &L,int i,int e)
{
    if(i<1||i>L.Length) return 0;//判断插入位置是否合法
    if (L.Length >= L.ListSize){ // 当前存储空间已满,增加分配
        int *newbase = (ElemType *)realloc(L.Elem,(L.ListSize+LISTINCREMENT)*sizeof (ElemType));
        if (!newbase) exit(-1);//存储分配失败
        L.Elem = newbase;// 新基址
        L.ListSize += LISTINCREMENT; //增加存储容量
    }
    int *q,*p;
    q=&(L.Elem[i-1]);//指针q表示插入位置
    for(p=&(L.Elem[L.Length-1]);p>=q;p--){
        *(p+1)=*p;//插入位置及之后的元素右移
    }
    *q=e;//插入元素e
    L.Length++;//顺序表长度加1
    return 1;
}

//删除i位置上的元素
Status ListIndele(Sqlist &L,int i,int &e)
{
    if(i<1||i>L.Length) return 0;//判断删除位置是否合法
    int *p,*q;
    e=L.Elem[i-1];//记录被删除元素的值
    q=&(L.Elem[L.Length-1]);
    for(p=&(L.Elem[i-1]);p<q;p++)
        *p=*(p+1);//将值左移
    L.Length--;//顺序表长度减1
    return 1;
}

Status ListInprint(Sqlist &L)
{
    printf("请输入顺序表长度:");
    scanf("%d",&L.Length);
    printf("\n请输入%d个元素:",L.Length);
    for(int i=0;i<L.Length;i++){
        scanf("%d",&L.Elem[i]);
    }
}

//清空顺序表
void ListClear(Sqlist &L)
{
    L.Length = 0;
}

//销毁顺序表
void DestroyList(Sqlist &L)
{
    if (L.Elem)
        delete L.Elem;//释放存储空间
}

//合并顺序表
void MergeList(Sqlist La,Sqlist Lb,Sqlist &Lc)
{
    int *Pa,*Pb,*Pc;
    int *Pa_Last,*Pb_Last;
    Pa=La.Elem;Pb=Lb.Elem;
    Lc.ListSize=Lc.Length=La.Length+Lb.Length;//Lc的长度
    Pc=Lc.Elem=(ElemType *)malloc(Lc.ListSize*sizeof(ElemType));//给Lc动态分配空间
    if(!Lc.Elem)  exit(-1); //分配空间
    Pa_Last=La.Elem+La.Length-1;//记录La的最后元素存放位置
    Pb_Last=Lb.Elem+Lb.Length-1;//记录Lb的最后元素存放位置
    while(Pa<=Pa_Last&&Pb<=Pb_Last){//归并操作
        if(*Pa<=*Pb)
            *Pc++=*Pa++;
        else
            *Pc++=*Pb++;
    }
    while (Pa<=Pa_Last) *Pc++=*Pa++;//若 La 不空
    while (Pb<=Pb_Last) *Pc++=*Pb++;//若 Lb 不空
    printf("\n合并之后的顺序表为:\n");
    for(int i=0;i<Lc.Length;i++){
        printf("%d ",Lc.Elem[i]);
    }
    printf("\n");
}


 

 

 

 

你可能感兴趣的:(数据结构实验--顺序表操作)