实现线性表的遍历查询插入删除合并

数据结构 书上给的代码 仅仅是 在某个特定的位置 插入 某一个元素。 


那样不是 线性表的要求。   申请动态内存空间神马的 真费劲, 不熟练。


#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <string>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <cctype>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define maxn 10010
#define INF 1<<30
#define list_init_size 100
#define list_incre 10
struct sqlist{
    int * elem;
    int length;
    int listsize;
};
int init(sqlist & l){   //  初始化线性表
    l.elem = (int *)malloc(list_init_size * sizeof(int));
    if(!l.elem)
        return 0;
    l.length = 0;
    l.listsize = list_init_size;
    return 1;
}
int search_list(sqlist &l, int num){    // 在表中寻找 num  返回的是 下标值 如果返回第几个数 需要加 1
    for(int i = 0; i < l.length; i++){
        if(l.elem[i] == num)
            return i;   //  返回下标值
    }
    return -1;
}
int insert_list(sqlist &l, int num){    //  在表中插入 num
    if(l.length == 0){  //  没有数据 直接插入
        int *p = l.elem;
        p[0] = num;
        l.length++;
        return 1;
    }
    int *p = &l.elem[l.length];
    int flag = 1;
    if(l.length >= l.listsize){
        int * newbase = (int *)realloc(l.elem,(l.listsize + list_incre) *sizeof(int));
        if(!newbase) return 0;
        l.elem = newbase;
        l.listsize += list_incre;
    }
    int *q;
    int * sta = l.elem;
    if((num <= (*sta))){   // 当 插入的位置为 最开头时
        for(int *x = p-1; x >= sta; x--)
            *(x+1) = *x;
        *(sta) = num;
        l.length ++;
        return 1;
    }
    for(q = l.elem; q < p; q ++){
        if((num >= (*q) && (num < (*(q+1)) || q == p-1)))
            break;
    }
    if(q == p){      // 插入位置为 最后时
        *(p+1) = num;
    }
    else{           // 插入位置为  中间时
        for(int *x = p-1; x >= q+1; x--)
            *(x+1) = *x;
        *(q+1) = num;
    }
    l.length ++;
}
int list_b(sqlist &l){   //  显示表
    for(int * q = l.elem; q < &(l.elem[l.length]); q++)
        printf("%d ",(*q));
    printf("\n");
}
int delete_list(sqlist & l, int num){   //  删除表中 的 元素 num  (只会删除 第一个num 如果需要删除所有的num,加一层循环即可)
    int *p = &l.elem[l.length];
    for(int *q = l.elem; q < p; q++){
        if((*q) == num){
            for(int *j = q; j <= p-1; j++){
                *(j) = *(j+1);
            }
            --l.length;
            return 1;
        }
    }
    return 0;
}
int union_list(sqlist &l1, sqlist & l2, sqlist &l){  //  把 两个 l1  l2  结合成 l
    int * pa = l1.elem;
    int * pb = l2.elem;
    l.listsize = l.length = l1.length + l2.length;
    int * pc = l.elem = (int *)malloc(l.listsize*sizeof(int));
    if(!l.elem)
        return 0;
    int *pa_last = l1.elem + l1.length - 1;
    int *pb_last = l2.elem + l2.length - 1;
    while(pa <= pa_last && pb <= pb_last){
        if(*pa <= *pb)
            *pc++ = * pa++;
        else *pc++ = *pb++;
    }
    while(pa <= pa_last) *pc++ = *pa++;
    while(pb <= pb_last) *pc++ = *pb++;
}
int main (){
    sqlist q,p;
    init(q);
    insert_list(q,4);  // 4 3 2 1 顺序 依次插入 结果为 1 2 3 4
    insert_list(q,3);
    insert_list(q,2);
    insert_list(q,1);
    list_b(q);
    delete_list(q,3);  // 删除3
    list_b(q);
    printf("****************\n");
    init(p);
    insert_list(p,2);
    insert_list(p,6);
    insert_list(p,4);
    insert_list(p,8);
    list_b(p);
    delete_list(p,4);
    list_b(p);
    printf("****************\n");
    sqlist af;
    init(af);
    union_list(q,p,af);     // 结合 p q  两个表 为 af
    list_b(af);
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值