顺序表基本操作
一、 实验目的
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 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/WEIWEI1095/p/16426593.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
生命依靠吸收负熵,避免了趋向平衡的衰退
分类:
数据结构与算法C
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通