目录
今日学习:
1.顺序表的定义。
typedef struct
{
ElemType elem[MAXSIZE];
int length;
int listsize;
}SqList;//定义一个静态顺序表
2.顺序表的初始化。
Status InitList_Sq(SqList& L) {
for (int i = 0; i < MAXSIZE; i++)
L.length = 0;//当前线性表为空表,长度为0
printf("一个空的线性表已经构建成功\n");//输出空线性表构建成功的提示消息
return OK;
}
3.顺序表的输入。
void InputList_Sq(SqList& L) {
int n;
printf("请输入顺序表长度:");
scanf_s("%d", &n);
L.length = n;
if (n > MAXSIZE)
{
printf("数组长度不合法!");
}
else
{
printf("请输入%d个元素:\n", n);
for (int i = 0; i < L.length; i++)
{
printf("第%d个元素为:", i);
scanf_s("%d", &L.elem[i]);
}
}
}
4.顺序表的输出。
void Output_Sq(SqList& L) {
printf("当前顺序表的元素依次是:");
for (int i = 0; i < L.length; i++)
printf("%d\t", L.elem[i]);
printf("\n");
}
5.顺序表的查找。
int LocateElem_Sq(SqList L, ElemType e) {
int i;
printf("请输入需要查找的值:");
scanf_s("%d", &e);
for (i = 0; i < L.length; i++)//i为下标序号
{
if (L.elem[i] == e)
{
printf("该值对应的位置为%d\n", i + 1);
}
}
return 0;
}
6.顺序表的插入。
Status ListInsert_Sq(SqList& L, int a, ElemType b) {
printf("请输入需要插入的位置:");
scanf_s("%d", &a);
printf("请输入需要插入的数值:");
scanf_s("%d", &b);
if (a<1 || a>L.length + 1)//插入位置不合法
return ERROR;
if (L.length == MAXSIZE)//数组空间已满
return ERROR;
int j;
for (j = L.length - 1; j >= a - 1; j--)
L.elem[j + 1] = L.elem[j];//插入位置及之后元素后移
L.elem[a - 1] = b;//新插入元素e存到i-1
++L.length;//表长加1
printf("元素插入成功!\n");
return OK;
}
7.顺序表的删除。
Status ListDelete_Sq(SqList& L, int i, ElemType e) {
printf("请输入需要删除的元素位置:");
scanf_s("%d", &i);
if (i<1 || i>L.length + 1)//判断元素下标是否越界
return FALSE;
if (!L.elem)
{
printf("空表\n");
return FALSE;
}
int j;
e = L.elem[i-1];//删除元素存入e
for (j = i ; j <= L.length; j++)
L.elem[j - 1] = L.elem[j];
L.length--;
printf("删除的元素是%d,这个元素的位置是%d\n", e, i);
printf("删除成功!\n");
return OK;
}
8.顺序表的合并。
Status MergeList_Sq(SqList& La, SqList& Lb, SqList& Lc) {
//已知顺序线性表La和Lb的元素按值非递减排列
//归并La,Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列
int i = 0, j = 0, k = 0;
Lc.length = k;
while ((i < La.length) && (j < Lb.length))
{
if (La.elem[i] > Lb.elem[j])
{
Lc.elem[k++] = Lb.elem[j++];
Lc.length++;
}
else {
Lc.elem[k++] = La.elem[i++];
Lc.length++;
}
}
while ((i < La.length) && (j >= Lb.length))
{
Lc.elem[k++] = La.elem[i++];
Lc.length++;
}
while ((i >= La.length) && (j < Lb.length))
{
Lc.elem[k++] = Lb.elem[j++];
Lc.length++;
}
Output_Sq(Lc);
return 0;
}
9.函数的调用。
int main(void) {
SqList L;
SqList La;
SqList Lb;
SqList Lc;
int command;
int e = NULL;
int i = NULL;
int a = NULL;
int b = NULL;
do {
menu();
printf("请选择:");
scanf_s("%d", &command);
switch (command)
{
case 1:InputList_Sq(L); break;
case 2:
Output_Sq(L); break;
case 3:
LocateElem_Sq(L, e); break;
case 4:
ListInsert_Sq(L, a, b); break;
case 5:
InputList_Sq(La); InputList_Sq(Lb);
MergeList_Sq(La, Lb, Lc); break;
case 6:
ListDelete_Sq(L, i, e); break;
}
} while (command);
return 0;
}
10.源代码。
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
#define OK 1
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct
{
ElemType elem[MAXSIZE];
int length;
int listsize;
}SqList;//定义一个静态顺序表
Status InitList_Sq(SqList& L);//初始化
void InputList_Sq(SqList& L);//输入
void Output_Sq(SqList& L);//输出
int LocateElem_Sq(SqList L, ElemType e);//查找
Status ListInsert_Sq(SqList& L, int i, ElemType e);//插入
Status ListDelete_Sq(SqList& L, int i, ElemType e);//删除
Status MergeList_Sq(SqList& La, SqList& Lb, SqList& Lc);//合并
void menu();
//主菜单函数
void menu()
{
printf("\t\t顺序表基本操作的实现\n");
printf("\t\t==============================\n");
printf("\t\t*请选操作 *\n");
printf("\t\t*1.输入 *\n");
printf("\t\t*2.输出 *\n");
printf("\t\t*3.查找 *\n");
printf("\t\t*4.插入 *\n");
printf("\t\t*5.合并 *\n");
printf("\t\t*6.删除 *\n");
printf("\t\t==============================\n");
}
//main函数
int main(void) {
SqList L;
SqList La;
SqList Lb;
SqList Lc;
int command;
int e = NULL;
int i = NULL;
int a = NULL;
int b = NULL;
do {
menu();
printf("请选择:");
scanf_s("%d", &command);
switch (command)
{
case 1:InputList_Sq(L); break;
case 2:
Output_Sq(L); break;
case 3:
LocateElem_Sq(L, e); break;
case 4:
ListInsert_Sq(L, a, b); break;
case 5:
InputList_Sq(La); InputList_Sq(Lb);
MergeList_Sq(La, Lb, Lc); break;
case 6:
ListDelete_Sq(L, i, e); break;
}
} while (command);
return 0;
}
//初始化
Status InitList_Sq(SqList& L) {
for (int i = 0; i < MAXSIZE; i++)
L.length = 0;//当前线性表为空表,长度为0
printf("一个空的线性表已经构建成功\n");//输出空线性表构建成功的提示消息
return OK;
}
//输入
void InputList_Sq(SqList& L) {
int n;
printf("请输入顺序表长度:");
scanf_s("%d", &n);
L.length = n;
if (n > MAXSIZE)
{
printf("数组长度不合法!");
}
else
{
printf("请输入%d个元素:\n", n);
for (int i = 0; i < L.length; i++)
{
printf("第%d个元素为:", i);
scanf_s("%d", &L.elem[i]);
}
}
}
//输出
void Output_Sq(SqList& L) {
printf("当前顺序表的元素依次是:");
for (int i = 0; i < L.length; i++)
printf("%d\t", L.elem[i]);
printf("\n");
}
//查找
int LocateElem_Sq(SqList L, ElemType e) {
int i;
printf("请输入需要查找的值:");
scanf_s("%d", &e);
for (i = 0; i < L.length; i++)//i为下标序号
{
if (L.elem[i] == e)
{
printf("该值对应的位置为%d\n", i + 1);
}
}
return 0;
}
//插入
Status ListInsert_Sq(SqList& L, int a, ElemType b) {
printf("请输入需要插入的位置:");
scanf_s("%d", &a);
printf("请输入需要插入的数值:");
scanf_s("%d", &b);
if (a<1 || a>L.length + 1)//插入位置不合法
return ERROR;
if (L.length == MAXSIZE)//数组空间已满
return ERROR;
int j;
for (j = L.length - 1; j >= a - 1; j--)
L.elem[j + 1] = L.elem[j];//插入位置及之后元素后移
L.elem[a - 1] = b;//新插入元素e存到i-1
++L.length;//表长加1
printf("元素插入成功!\n");
return OK;
}
//删除
Status ListDelete_Sq(SqList& L, int i, ElemType e) {
printf("请输入需要删除的元素位置:");
scanf_s("%d", &i);
if (i<1 || i>L.length + 1)//判断元素下标是否越界
return FALSE;
if (!L.elem)
{
printf("空表\n");
return FALSE;
}
int j;
e = L.elem[i-1];//删除元素存入e
for (j = i ; j <= L.length; j++)
L.elem[j - 1] = L.elem[j];
L.length--;
printf("删除的元素是%d,这个元素的位置是%d\n", e, i);
printf("删除成功!\n");
return OK;
}
Status MergeList_Sq(SqList& La, SqList& Lb, SqList& Lc) {
//已知顺序线性表La和Lb的元素按值非递减排列
//归并La,Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列
int i = 0, j = 0, k = 0;
Lc.length = k;
while ((i < La.length) && (j < Lb.length))
{
if (La.elem[i] > Lb.elem[j])
{
Lc.elem[k++] = Lb.elem[j++];
Lc.length++;
}
else {
Lc.elem[k++] = La.elem[i++];
Lc.length++;
}
}
while ((i < La.length) && (j >= Lb.length))
{
Lc.elem[k++] = La.elem[i++];
Lc.length++;
}
while ((i >= La.length) && (j < Lb.length))
{
Lc.elem[k++] = Lb.elem[j++];
Lc.length++;
}
Output_Sq(Lc);
return 0;
}