数据结构 书上给的代码 仅仅是 在某个特定的位置 插入 某一个元素。
那样不是 线性表的要求。 申请动态内存空间神马的 真费劲, 不熟练。
#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;
}