您的位置:首页 > 其它

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

2014-09-11 17:23 405 查看
数据结构 书上给的代码 仅仅是 在某个特定的位置 插入 某一个元素。

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

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐