3.建立顺序表时可利用随机函数自动产生数据。
注意问题:
1、 插入、删除时元素的移动原因、方向及先后顺序。 2、 理解函数形参与实参的传递关系。
部分源代码: DS.h
#include
#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0
typedef int Status;
SqList.h
#ifndef SQLIST_H_INCLUDED #define SQLIST_H_INCLUDED
#include \
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的元素*/
6
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
SqList.cpp
#include \
void menu() {
printf(\ 顺序表基本操作\\n\\n\ printf(\建 立 顺 序 表\\n\ printf(\遍 历 顺 序 表\\n\ printf(\删 除 第 i 个 元 素\\n\ printf(\删 除 值 为 x 的 元 素\\n\ printf(\奇 数 排 在 偶 数 之 前\\n\ printf(\插 入 法 生 成 递 增 有 序 表\\n\
printf(\两个非递减有序表La和Lb合并成非递减有序表Lc\\n\ printf(\退 出\\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)
7
{
int n, i;
printf(\请输入顺序表长度:\ scanf(\ if(InitList_Sq(L, n)) {
printf(\请输入%d个元素:\ for(i = 0; i < n; i++) {
scanf(\ L.length++; } return OK; } else
return ERROR; }
/*输出顺序表*/
void PrintList_Sq(SqList L) { int i;
printf(\顺序表中元素为:\\n\ for(i = 0; i < L.length; i++) {
printf(\ }
printf(\}
/*删除第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;
8
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) { }
/*奇数排在偶数之前*/ Status AdjustList_Sq(SqList &L) {
ElemType *p, *q; int temp;
return OK; }
/*插入法生成递增有序表,有序表生成成功返回OK,失败返回ERROR*/ Status OrderList_sq(SqList &L, int n) {
int i, j, x; /*x表示每次待插入的元素*/ }
/*两个非递减有序表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));
9
ElemType *p, *q;
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++; }
main.cpp
#include \int main() {
int choice, n, i, x; SqList L, La, Lb, Lc; while(1) {
menu();
printf(\选择你的操作:\ scanf(\ switch(choice) {
case 1:
if(CreateList_Sq(L))
printf(\顺序表创建成功\\n\ else
printf(\顺序表创建失败\\n\ break; case 2:
PrintList_Sq(L); break; case 3:
printf(\请输入删除元素的位置:\ scanf(\ if(DeleteList_Sq(L, i, x))
10