c++创建顺序表

#include <stdio.h>
#include <stdlib.h>
#include<iostream>

using namespace std;

#define LIST_INIT_SIZE 100 
#define LISTINCREMENT  10 //这个是顺序表需要增加的单位长度
void PrintElem(int e) { printf("%d ", e); };

typedef struct {
    int* elem;            //这是指向这个结构体的指针变量
    int length;           //这是顺序表的长度
    int listsize;         //这是顺序表当前分配的大小,比如书里面给的100大小的空间
}SqList;

//顺序表初始化
void InitListSqlist(SqList* L) {
    //注意这个函数参数的位置,这里可以写成SqList *L,下面必须写成L->elem或者(*L).elem,
    //如果是Sqlist &L 下面写的形式是L.elem(*L 表示的是指针,而&L是引用
    L->elem = (int*)malloc(LIST_INIT_SIZE * sizeof(int));
    if (!(L->elem)) {
        return;
    }
    L->length = 0;
    L->listsize = LIST_INIT_SIZE;
}

//某个位置插入一个数
void InsertSqlist(SqList* L, int i, int e) {
    //在顺序表1-n的i位置之前插入一个数e
    int* newbase, * p, * q;
    if (i<1 || i>(L->length) + 1) return;
    if ((L->length) >= (L->listsize)) {
        //如果插入的数据过大,超过顺序表当前大小
        //需要重新开辟空间
        //这里用realloc 是表明在谁基础上再改变内存
        //newbase是一个新的地址
        newbase = (int*)realloc((L->elem), (L->listsize + LISTINCREMENT) * sizeof(int));
        if (!newbase) return;                             //如果不是这个,返回
        L->elem = newbase;                                //把这个新的地址分给elem
        L->listsize += LISTINCREMENT;                     //容量增加
    }
   
    q = &(L->elem[i - 1]);                                //q表示数据e insert的位置
    for (p = &((*L).elem[(*L).length - 1]); p >= q; --p)
        *(p + 1) = *p;                                    //实现右移
    *q = e;                                               //这里说明一下 ( * &q)就是表示本身的数据
    (*L).length++;
}

//获取顺序表长度
int ListLengthSqlist(SqList L)
{
    return L.length;
}
void GetElemSqlist(SqList L, int i, int* e) {
    if (i<1 || i>L.length) return;
    else *e = L.elem[i - 1];
}

//定位函数
int LocateElemSqlist(SqList L, int e, int(Compare)(int, int))
{
    int i = 1;	//i的初值为第一个元素的位序

    while (i <= L.length && !Compare(e, L.elem[i - 1]))
        ++i;

    if (i <= L.length)
        return i;
    else
        return 0;
}

int EqualSqlist(int e1, int e2)
{
    return e1 == e2 ? true : false;
}
//合并表a和b到a
void UnionSqlist(SqList* La, SqList Lb)
{
    int La_len, Lb_len;
    int i;
    int e;

    La_len = ListLengthSqlist(*La);
    Lb_len = ListLengthSqlist(Lb);

    for (i = 1; i <= Lb_len; i++)
    {
        GetElemSqlist(Lb, i, &e);
        if (!LocateElemSqlist(*La, e, EqualSqlist)) //如果la不存在e,合并
            InsertSqlist(La, ++La_len, e);
    }
}
//输出表
void ReverseSqlist(SqList L, void(Visit)(int))
{
    int i;
    cout<<"{";
    for (i = 0; i < L.length; i++) {

        Visit(L.elem[i]);
    }
    cout<<"}";
}
//对表进行排序
void SortSqlist(SqList* L)
{
    int i, j, k, temp;
    //temp=L->elem[0];
    for (i = 1; i < L->length; i++)
    {
        temp = L->elem[i];                                //待插入元素提取出来
        for (j = i - 1; j >= 0 && L->elem[j] > temp; j--) //若待插入元素比有序序列中比较元素小,就将该比较元素后移一位
        {
            L->elem[j + 1] = L->elem[j];

        }
        L->elem[j + 1] = temp;                            //实现待插入元素插入
        for (k = 0; k < L->length; k++)                   //打印一趟排序
         cout<< L->elem[k] ;
        cout << endl;
    }
}
//复制表b到a
void CopySqlist(SqList* a, SqList* b)
{
    int i, x;
    for (i = 0; i < b->length; i++)
    {
        x = b->elem[i];
        InsertSqlist(a, i+1, x);
    }
}

//test
int main() {
    SqList La, Lb,Lc;
    int i;
    int n, m;
    InitListSqlist(&La);
    cout << "输入表a的长:";
    cin >> n;
    cout << endl;
    cout << "输入表a的值: " << endl;
    for (i = 1; i <= n; i++) {
        int n;
        cin >> n;
        InsertSqlist(&La, i,n);
    }
    InitListSqlist(&Lb);
    cout << "输入表b的长:";
    cin >> m;
    cout << endl;
    cout<<"输入表b的值: " << endl;
    for (i = 1; i <= m; i++) {
        int m;
        cin >> m;
        InsertSqlist(&Lb, i, m);
    }

    InitListSqlist(&Lc);
    CopySqlist(&Lc, &La);

    UnionSqlist(&La, Lb);
    SortSqlist(&La);
    cout << "输出表a:" << endl;
    ReverseSqlist(La, PrintElem);

    cout << endl;
    cout << "输出原表a:" << endl;
    ReverseSqlist(Lc, PrintElem);

    cout << endl;
    cout << "输出表b:" << endl;
    ReverseSqlist(Lb, PrintElem);
    return 0;
}










实现顺序表的合并,逆置,复制,排序,插入等

  • 7
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值