实现线性表的遍历查询插入删除合并
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; }
相关文章推荐
- (1)顺序表的操作 ① 输入一组整型元素序列,建立线性表的顺序存储结构。 ② 实现该线性表的遍历。 ③ 在该顺序表中查找某一元素,查找成功显示查找元素,否则显示查找失败。 ④ 在该顺序表中删除或插入指
- C++实现二叉树的插入、删除、查询、遍历
- (2)单链表的操作 ① 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。 ② 实现该线性表的遍历。 ③ 在该单链表的第i个元素前插入一个整数。 ④ 删除该单链表中的第i个元素,其值通过参数
- 线性表初始化、判空、插入、删除、遍历、修改、查值、合并
- C语言:实现线性表基本表示(数组元素的删除,插入,合并)
- 二叉查找树(查询、插入、遍历、删除)--Java实现
- 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。 ② 实现该线性表的遍历。 ③ 在该单链表的第i个元素前插入一个整数。 ④ 删除该单链表中的第i个元素,其值通过参数将其返回。 ⑤ 建立两个
- c语言实现线性表的建立,初始化,插入,删除,查找,遍历以及时间复杂度分析
- c++实现二叉树的插入、删除、查询、遍历和树形打印
- 【数据结构】顺序线性表的插入、删除、合并实现
- 线性表创建插入删除及各种排序算法实现
- java实现数据结构-线性表-顺序表,实现插入,查找,删除,合并功能
- BST查询,插入,删除api实现与测试
- 编程内功修炼之数据结构—BTree(二)实现BTree插入、查询、删除操作
- C语言实现链表的头插,尾插,插入,修改,删除和遍历
- 二叉树(插入,删除,遍历等)java实现
- 线性表之顺序表的创建、初始化、查找、删除、插入和合并
- C++单项链表 (添加、插入、删除、遍历、合并、逆序、判断是否循环)
- 算法导论中十二章C++实现二叉查找树建立,插入,删除,遍历操作
- 用结构体实现链表的创建、遍历、结点插入、结点删除、链表删除-----带菜单选项