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
    评论
用模板方式实现顺序表的合并 #include "stdafx.h" #include #define MaxSize 100 template class SeqList { private: T * Mylist; int ListMaxSize; int Length; public: SeqList(int ListMaxSize=MaxSize); //构造函数 ~SeqList(void);// 析构函数 bool SLIsEmpty(void); // 判断表是否为空 bool SLIsFull(void);//判断表是否满 int ListLength(void){return Length;}//求表长度 T SLGetElem(int i); // 取得第i个元素的值 int SLFind(T & x,int index); //查找值为x的结点 bool SLInsert(int i,T & x); // 在表的第i个位置插入新结点 bool SLDelete(int i); // 删除表的第i个位置的结点 void CreateList(int num);// 创建一个包含num个元素的顺序表 void SLPrint(); //输出全体元素 }; template SeqList ::SeqList(int listMaxSize) //初始化顺序表 { if(listMaxSize>0){ ListMaxSize=listMaxSize; Length=0; Mylist=new T [ListMaxSize]; // 创建连续的表空间 } } template SeqList ::~SeqList(void) { delete [] Mylist;//删除表,释放表空间 } template void SeqList ::CreateList(int num) { T x; Length=0; cout << "请输入"<<num<<"个整数数据元素以创建一个线性表"<<endl; for (int i=0;i>x; Mylist[i]=x; Length++; } } template bool SeqList ::SLIsEmpty(void) // 判断表是否为空 { return (Length<=0)?true:false; //表空则返回真(true),否则返回假(false) } template bool SeqList ::SLIsFull(void)//判断表是否满 { return(Length>=ListMaxSize)?true:false; //表满则返回真(true),否则返回假(false) } template T SeqList ::SLGetElem(int i) // 取得第i个元素的值 { return(iLength-1)?-1:Mylist[i]; } template int SeqList ::SLFind(T & x,int index) //查找值为x的结点 { for(int i=0;i<index;i++) if(Mylist[i]==x) return i+1; return -1;//没有找到给定元素 } template bool SeqList ::SLInsert(int i,T & x) // 在表的第i个位置插入新结点 { if(iLength) {cout <<"参数i不合理!" <<endl; return false;} else if(Length==ListMaxSize) {cout<< "表已满,无法插入!"<i;j--) Mylist[j]=Mylist[j-1]; Mylist[j]=x; Length++; return true; } } template <clas

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值