顺序表基本操作

一、 实验目的

1.掌握顺序存储结构的特点。
2.掌握顺序存储结构的常见算法。

二、 实验内容及要求
1、 任务描述
编写一个完整的程序,实现顺序表的生成、插入、删除、输出等基本运算。
(1) 建立一个顺序表,含有n个数据元素。
(2) 输出顺序表。
(3) 在顺序表中删除值为x的结点或者删除给定位置i的结点。
(4) 实现把该表中所有奇数排在偶数之前,即表的前面为奇数,后面为偶数。
(5) 输入整型元素序列,利用有序表插入算法建立一个有序表。
(6) *利用算法5建立两个非递减有序表A和B,并把它们合并成一个非递减有序表C。
(7) 在主函数中设计一个简单的菜单,分别测试上述算法。
(8) *综合训练:
利用顺序表实现一个班级学生信息管理(数据录入、插入、删除、排序、查找等)。

SqList.h

#ifndef DACM_ZSN_SQLIST_H #define DACM_ZSN_SQLIST_H #include "DS.h" #define MAXSIZE 100 //表中元素的最大个数 typedef int ElemType; //元素类型 typedef struct { ElemType *elem; //线性表 int length; //表的实际长度 int listsize; //当前分配的存储容量 } SqList; //顺序表的类型名 void menu(); Status InitList_Sq(SqList &L, int n);/*初始化顺序表*/ Status CreateList_Sq(SqList &L);/*建立顺序表*/ void PrintList_Sq(SqList L);/*输出顺序表*/ Status DeleteList_Sq(SqList &L, int i, ElemType &e);/*删除第i个元素*/ Status DeleteListX_Sq(SqList &L, ElemType x);/*删除值为x的元素*/ Status AdjustList_Sq(SqList &L);/*奇数排在偶数之前*/ Status OrderList_sq(SqList &L, int n);/*插入法生成递增有序表*/ void MergeList_Sq(SqList La, SqList Lb, SqList &Lc);/*两个非递减有序表A和B,并把它们合并成一个非递减有序表C*/ #endif // SQLIST_H_INCLUDED

DS.h

#ifndef DACM_ZSN_DS_H #define DACM_ZSN_DS_H #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 typedef int Status; #endif //DACM_ZSN_DS_H

Exp_SqList.cpp

#include<iostream> #include<string> #include<stdlib.h> #include "SqList.h" void menu() { printf("\t\t\t 顺序表基本操作\n\n"); printf("\t\t\t1.建 立 顺 序 表\n"); printf("\t\t\t2.遍 历 顺 序 表\n"); printf("\t\t\t3.删 除 第 i 个 元 素\n"); printf("\t\t\t4.删 除 值 为 x 的 元 素\n"); printf("\t\t\t5.奇 数 排 在 偶 数 之 前\n"); printf("\t\t\t6.插 入 法 生 成 递 增 有 序 表\n"); printf("\t\t\t7.两个非递减有序表La和Lb合并成非递减有序表Lc\n"); printf("\t\t\t0.退 出\n\n"); } /*初始化顺序表*/ Status InitList_Sq(SqList &L, int n) { L.elem = (ElemType *) malloc(n * sizeof(ElemType)); if (!L.elem) exit(OVERFLOW); L.length = 0; L.listsize = n; return OK; } /*建立顺序表*/ Status CreateList_Sq(SqList &L) { int n, i; printf("请输入顺序表长度:"); scanf("%d", &n); if (InitList_Sq(L, n)) { printf("请输入%d个元素:", n); for (i = 0; i < n; i++) { scanf("%d", &L.elem[i]); L.length++; } return OK; } else return ERROR; } /*输出顺序表*/ void PrintList_Sq(SqList L) { int i; printf("顺序表中元素为:\n"); for (i = 0; i < L.length; i++) { printf("%d ", L.elem[i]); } printf("\n"); } /*删除第i个元素*/ Status DeleteList_Sq(SqList &L, int i, ElemType &e) { ElemType *p, *q; if ((i < 1) || (i > L.length)) return ERROR; p = &(L.elem[i - 1]); e = *p; q = L.elem + L.length - 1; for (++p; p <= q; ++p) *(p - 1) = *p; --L.length; return OK; } /*删除值为x的元素,删除成功返回OK,删除失败返回ERROR*/ Status DeleteListX_Sq(SqList &L, ElemType x) { ElemType *p, *q; if(&L!=NULL){ int k=0,i; for(i=0;i<L.length;i++) { if(L.elem[i]!=x) { L.elem[k] = L.elem[i]; k++; } } L.length=k; return OK; } return ERROR; } /*奇数排在偶数之前*/ Status AdjustList_Sq(SqList &L) { ElemType *p, *q; int temp; int i=0,k=0; for(i=0;i<=L.listsize;i++) { if(L.elem[i]%2!=0) { temp=L.elem[i]; L.elem[i]=L.elem[k]; L.elem[k]=temp; k++; } else continue; } return OK; } /*插入法生成递增有序表,有序表生成成功返回OK,失败返回ERROR*/ Status OrderList_sq(SqList &L, int n) { int i, j, x; /*x表示每次待插入的元素*/ int k; if (InitList_Sq(L, n)) { printf("请输入%d个元素:", n); for (k = 0;k < n;k++) { scanf("%d", &x); i = L.length - 1; while (i >= 0 && x < L.elem[i]) { i--; } for (j = L.length - 1; j >= i + 1; j--) {//从最后一个元素开始向后移动一个位置 L.elem[j + 1] = L.elem[j]; } L.elem[i + 1] = x; L.length++; } return OK; } else return ERROR; } /*两个非递减有序表A和B,并把它们合并成一个非递减有序表C*/ void MergeList_Sq(SqList La, SqList Lb, SqList &Lc) { ElemType *pa, *pb, *pc, *pa_last, *pb_last; pa = La.elem; pb = Lb.elem; Lc.listsize = Lc.length = La.length + Lb.length; pc = Lc.elem = (ElemType *) malloc(Lc.listsize * sizeof(ElemType)); if (!Lc.elem) exit(OVERFLOW); pa_last = La.elem + La.length - 1; pb_last = Lb.elem + Lb.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() { int choice, n, i, x; SqList L, La, Lb, Lc; while (1) { menu(); printf("选择你的操作:"); scanf("%d", &choice); switch (choice) { case 1: if (CreateList_Sq(L)) printf("顺序表创建成功\n"); else printf("顺序表创建失败\n"); break; case 2: PrintList_Sq(L); break; case 3: printf("请输入删除元素的位置:"); scanf("%d", &i); if (DeleteList_Sq(L, i, x)) printf("被删除元素值为:%d\n", x); else printf("删除失败\n"); break; case 4: printf("请输入删除元素值:"); scanf("%d", &x); if (DeleteListX_Sq(L, x)) printf("删除成功\n"); else printf("删除失败\n"); PrintList_Sq(L); break; case 5: AdjustList_Sq(L); printf("新链表为:\n"); PrintList_Sq(L); break; case 6: printf("请输入顺序表长度:"); scanf("%d", &n); if (OrderList_sq(L, n)) { printf("值有序顺序表为:\n"); PrintList_Sq(L); } else printf("顺序表创建失败\n"); break; case 7: printf("请输入顺序表La的长度:"); scanf("%d", &n); OrderList_sq(La, n); printf("请输入顺序表Lb的长度:"); scanf("%d", &n); OrderList_sq(Lb, n); MergeList_Sq(La, Lb, Lc); printf("合并后的顺序表为:\n"); PrintList_Sq(Lc); break; case 0: return 0; default: printf("输入错误,请重新输入\n"); } } }

__EOF__

本文作者weijie
本文链接https://www.cnblogs.com/WEIWEI1095/p/16426593.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   WEIWEI1095  阅读(280)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
*/
作品集 //
点击右上角即可分享
微信分享提示