顺序表:逻辑上连续,物理结构上也连续
实现一个具有“增、删(根据位置删除,根据元素删除)、查、初始化、输入、打印”等简单功能的顺序表:
源码:
头文件部分("sequence.h"):
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<stdlib.h>
#define MAXSIZE 20
typedef int ElemType;
typedef struct
{
ElemType data[MAXSIZE];
int last;
}SeqList;
void creat(SeqList *L); //创建顺序表
int InsertSList(SeqList *L, int i, int x); //在i位置插入x
int DeleteList(SeqList *L, int i); //删除i位置的元素
int GetData(SeqList *L, int x); //查找值为x的下标
int GetLength(SeqList *L); //求顺便长度
int InitSList(SeqList *L); //初始化顺序表,释放整个顺表
void output(SeqList * L); //打印整个顺序表
void reverse_list(SeqList *L); //反转整个顺序表
void sortrank(SeqList *L); //对顺序表进行排序
//封装函数部分("sequence.c"):
#include"sequence.h"
void creat(SeqList *L) //创建一个顺序表
{
printf("请输入顺序表:\n");
for (int n = 0; n <= L->last; n++)
{
scanf("%d", &(L->data[n]));
}
printf("输入成功\n");
}
int InsertSList(SeqList *L, int i, int x) //将x插入到i位置上,成功返回1
{
if ((i<1) || i>(L->last + 2))
return -1;
if ((L->last) == (MAXSIZE - 1))
return -1;
for (int n = L->last; n >= i - 1; n--)
L->data[n + 1] = L->data[n];
L->data[i - 1] = x;
L->last++;
return 1;
}
int DeleteList(SeqList *L, int i) //删除i位置上的元素,成功返回1
{
if ((i > L->last + 1) || (i < 1))
return -1;
if (L->last == -1)
return -1;
for (int n = i - 1; n <L->last; n++)
{
L->data[n] = L->data[n + 1];
}
L->last--;
return 1;
}
int GetData(SeqList *L, int x) //查找x元素的所在的位置
{
int i = 0;
if (L->last<0)
return -1;
while (i <= L->last)
{
if (L->data[i] == x)
return i + 1;
i++;
}
return -1;
}
int GetLength(SeqList *L) //求取表的长度
{
return (L->last + 1);
}
int InitSList(SeqList *L) //初始化顺序表,将当前顺序表释放
{
L->last = -1;
return 1;
}
void output(SeqList * L) //打印顺序表
{
if (L->last==-1)
{
printf("请先创建顺序表\n");
}
else
{
for (int n = 0; n <= L->last; n++)
printf("%d ", L->data[n]);
printf("\n");
}
}
void reverse_list(SeqList *L)
{
if (L->last == -1)
printf("请先创建顺序表\n");
else
{
ElemType *left = L->data;
ElemType *right = left + L->last;
while (left<right)
{
ElemType tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
printf("逆序成功\n");
}
}
void sortrank(SeqList *L) //对顺序表进行排序
{
ElemType tmp;
int i = 0;
int j = 0;
for (i = 0; i <= L->last; i++)
{
for (j = 0; j <(L->last - i); j++)
{
if (L->data[j]>L->data[j + 1])
{
tmp = L->data[j];
L->data[j] = L->data[j + 1];
L->data[j + 1] = tmp;
}
}
}
printf("排序成功\n");
}
主函数部分:
#include"sequence.h"
int main()
{
int m = 0;
int n = 0;
int i = 0;
int ret=0;
ElemType x;
SeqList L;
L.last = -1;
printf("***********************************************\n");
printf("***********************************************\n");
printf("********0.exit 1.Creat*************\n");
printf("********2.InsertSList 3.ListDelete********\n");
printf("********4.FindData 5.GetLength*********\n");
printf("********6.InitSList 7.output************\n");
printf("********8.ReverseList 9.Sortrank**********\n\n\n");
while (1)
{
printf("请选择功能: ");
scanf("%d", &n);
switch (n)
{
case 0:
exit(1);
break;
case 1:
while (1)
{
printf("请输入顺序表长度:");
scanf("%d", &L.last);
if (L.last < 1)
printf("输入无效,请重新输入\n");
else
break;
}
L.last = L.last - 1;
creat(&L);
break;
case 2:
printf("请输入要插入的位置: 和要插入的元素:\n");
scanf("%d%d", &i, &x);
ret = InsertSList(&L, i, x);
if (ret == 1)
printf("插入成功\n");
else
printf("插入失败\n");
break;
case 3:
printf("****1、位置删除 2、元素删除****\n");
printf("请选择删除方式:");
while (1)
{
scanf("%d", &m);
if (m==1||m==2)
break;
else
printf("选择无效,请重新选择\n");
}
switch (m) //开始执行删除的方式
{
case 1:
{
printf("请输入要删除的位置:");
scanf("%d", &i);
ret = DeleteList(&L,i);
break;
}
case 2:
{
int i = 0;
printf("输入要删除的元素:");
scanf("%d", &x);
while (1)
{
i = GetData(&L, x);
if (i ==-1)
break;
ret =DeleteList(&L, i);
}
break;
} //删除结束
}
if (ret == 1)
printf("删除成功\n");
else
printf("删除失败\n");
break;
case 4:
printf("请输入要查找的元素:");
scanf("%d",&x);
ret=GetData(&L,x);
if (ret==-1)
printf("查询无果\n");
else
printf("查找成功:%d\n",ret);
break;
case 5:
ret=GetLength(&L);
printf("顺序表长度:%d\n", ret);
break;
case 6:
InitSList(&L);
printf("初始化成功\n");
break;
case 7:
printf("打印顺序表:");
output(&L);
break;
case 8:
reverse_list(&L);
break;
case 9:
sortrank(&L);
break;
default:
printf("选择无效,请重新选择\n");
break;
}
ret = 0;
}
system("pause");
return 0;
}
转载于:https://blog.51cto.com/11142019/1760947