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

来源:互联网 发布:mac terminal 有趣 编辑:程序博客网 时间:2024/04/30 05:24

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


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


#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 10struct 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
原创粉丝点击