main.c:
#include <stdio.h>
#include <stdlib.h>
#include "SequenceList.h"
int main()
{
//创建顺序表和指针
SequenceList SL, * P_SL;
int choice = 0;
P_SL = &SL;
SL.length = 0; //初始化顺序表长度
menu();
while (true)
{
printf("\n请输入您的选择:");
fflush(stdin);
scanf_s("%d", &choice);
switch (choice)
{
case 0:
exitSystem();
break;
case 1:
inputPL(P_SL);
break;
case 2:
ouputPL(P_SL);
break;
case 3:
insertSLHead(P_SL);
break;
case 4:
insertSLTail(P_SL);
break;
case 5:
insertSLIndex(P_SL);
break;
case 6:
deleteSLHead(P_SL);
break;
case 7:
deleteSLTail(P_SL);
break;
case 8:
deleteSLIndex(P_SL);
break;
case 9:
bubbleSortSLData(P_SL);
break;
case 10:
findSLData(P_SL);
break;
default:
system("cls");
break;
}
}
system("pause");
return 0;
}
SequenceList.h:
#ifndef _SEQUENCE_H_
#define _SEQUENCE_H_
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAXSIZE 20
//定义顺序表
typedef struct
{
int data[MAXSIZE]; //顺序表中用来保存数据的数组
int length; //顺序表的长度
}SequenceList;
//退出系统
void exitSystem();
//用来设计虚拟界面的边框
void printStar();
//界面
void menu();
//顺序表的初始化 以及输入
void inputPL(SequenceList* P_SL);
//输出顺序表
void ouputPL(SequenceList* P_SL);
//从头部插入数据
void insertSLHead(SequenceList* P_SL);
//从尾部插入数据
void insertSLTail(SequenceList* P_SL);
//指定位置插入数据
void insertSLIndex(SequenceList* P_SL);
//删除头部结点
void deleteSLHead(SequenceList* P_SL);
//删除尾部结点
void deleteSLTail(SequenceList* P_SL);
//指定位置删除结点
void deleteSLIndex(SequenceList* P_SL);
//查找顺序表中的元素
void findSLData(SequenceList* P_SL);
//冒泡排序
void bubbleSortSLData(SequenceList* P_SL);
#endif
SequenceList.c:
#include "SequenceList.h"
//用来设计虚拟界面的边框
void printStar()
{
for (int i = 0; i < 70; i++)
{
printf("*");
}
printf("\n");
}
//界面
void menu()
{
printStar();
printf("\t\t\t欢迎进入顺序表操作界面!\n");
printf("请从键盘输入数字,完成对应的操作(1到8为有效操作,输入其他退出程序)\n");
printf("\t 0.退出系统\n");
printf("\t 1.从键盘连续输入n个整数,建立一个顺序表\n");
printf("\t 2.输出该顺序表\n");
printf("\t 3.从键盘输入一个整数,插入到顺序表的头部\n");
printf("\t 4.从键盘输入一个整数,插入到顺序表的尾部\n");
printf("\t 5.从键盘输入一个整数,插入到顺序表的指定位置\n");
printf("\t 6.从顺序表的头部删除一个结点\n");
printf("\t 7.从顺序表的尾部删除一个结点\n");
printf("\t 8.从顺序表的指定位置删除一个结点\n");
printf("\t 9.对顺序表进行排序(冒泡排序)\n");
printf("\t 10.从顺序表中查找元素(二分查找)查找之前要先排序\n");
printStar();
}
//退出系统
void exitSystem()
{
printf("欢迎下次使用!\n");
system("pause");
exit(0);
}
//初始化顺序表
void inputPL(SequenceList* P_SL)
{
int length;
printf("请输入顺序表的长度:");
scanf_s("%d", &length);
printf("请输入 %d 个数据:", length);
for (int i = 0; i < length; i++)
{
scanf_s("%d", &P_SL->data[i]);
}
P_SL->length = length; //更新一下顺序表的长度
}
//输出顺序表
void ouputPL(SequenceList* P_SL)
{
if (P_SL->length == 0)
{
printf("该顺序表为空,请先选择输入!\n");
}
else
{
printf("输出的顺序表:\n");
for (int i = 0; i < P_SL->length; i++)
{
printf("array[%d] = %d \n", i, P_SL->data[i]);
}
printf("\n");
}
}
//从头部插入数据
void insertSLHead(SequenceList* P_SL)
{
int data = 0;
printf("请输入一个整数,从头部插入数据:\n");
scanf_s("%d", &data);
if (P_SL->length == 0)
{
//顺序表为空
P_SL->length++;
P_SL->data[0] = data;
}
else
{
P_SL->length++;
for (int i = P_SL->length - 1; i > 0; i--)
{
P_SL->data[i] = P_SL->data[i - 1];
}
P_SL->data[0] = data;
}
printf("从头部插入数据已成功!\n");
}
//从尾部插入数据
void insertSLTail(SequenceList* P_SL)
{
int data = 0;
printf("请输入一个整数,从尾部插入到顺序表中:\n");
scanf_s("%d", &data);
P_SL->length++;
P_SL->data[P_SL->length-1] = data;
printf("从尾部插入数据成功!\n");
}
//指定位置插入数据
void insertSLIndex(SequenceList* P_SL)
{
int data = 0, index = 0;
printf("请输入插入顺序表中的位置(下标值):\n");
scanf_s("%d", &index);
if (index == 0)
{
insertSLHead(P_SL);
}
else if (index == P_SL->length)
{
insertSLTail(P_SL);
}
else if (index < 0 || index > P_SL->length)
{
printf("您输入插入的位置不对,重新输入!\n");
insertSLIndex(P_SL);
}
else
{
P_SL->length++;
printf("请输入您要插入的结点值:\n");
scanf_s("%d", &data);
for (int i = P_SL->length - 2; i > 0; i--)
{
if (i == index)
{
for (int j = P_SL->length; j >= i; j--)
{
P_SL->data[j] = P_SL->data[j - 1];
}
P_SL->data[index] = data;
break;
}
}
}
}
//删除头部结点
void deleteSLHead(SequenceList* P_SL)
{
if (P_SL->length == 0)
{
printf("该顺序表为空,无法删除!\n");
}
else
{
for (int i = 1; i < P_SL->length; i++)
{
P_SL->data[i - 1] = P_SL->data[i];
}
printf("头部删除结点成功!\n");
P_SL->data[P_SL->length] = 0;
P_SL->length--;
}
}
//删除尾部结点
void deleteSLTail(SequenceList* P_SL)
{
if (P_SL->length == 0)
{
printf("该顺序表为空,无法删除!\n");
}
else
{
P_SL->data[P_SL->length - 1] = 0;
P_SL->length--;
printf("尾部删除结点成功!\n");
}
}
//指定位置删除结点
void deleteSLIndex(SequenceList* P_SL)
{
if (P_SL->length == 0)
{
printf("该顺序表为空,无法删除!\n");
}
else
{
int data = 0, index = 0;
printf("请输入删除结点的位置:");
scanf_s("%d", &index);
if (index == 0)
{
deleteSLHead(P_SL);
}
else if (index == P_SL->length - 1)
{
deleteSLTail(P_SL);
}
else if (index < 0 || index >= P_SL->length)
{
printf("您输入删除的位置不对,重新输入!\n");
deleteSLIndex(P_SL);
}
else
{
for (int i = 1; i < P_SL->length - 1; i++)
{
if (index == i)
{
for (int j = i; j < P_SL->length - 1; j++)
{
P_SL->data[j] = P_SL->data[j + 1];
}
P_SL->data[P_SL->length - 1] = 0;
P_SL->length--;
printf("指定位置删除成功!\n");
break;
}
}
}
}
}
//冒泡排序
void bubbleSortSLData(SequenceList* P_SL)
{
for (int i = 0; i < P_SL->length; i++) //确定排序趟数
{
for (int j = i + 1; j < P_SL->length; j++) //确定比较次数
{
if (P_SL->data[i] > P_SL->data[j])
{
int temp = P_SL->data[i];
P_SL->data[i] = P_SL->data[j];
P_SL->data[j] = temp;
}
}
}
printf("排序成功!\n");
}
//查找顺序表中的元素
void findSLData(SequenceList* P_SL)
{
if (P_SL->length == 0)
{
printf("该顺序表为空,无法查找!\n");
}
else
{
/*二分查找法*/
int data = 0;
int top = 0, end = P_SL->length - 1, mid; //定义头部,中部,尾部三个下标
int find = -1; //定义需要找的数的下标 -1说明没找到
//printf("end = %d\n", end);
printf("请输入查找的数据:");
scanf_s("%d", &data);
while (top <= end)
{
mid = (top + end) / 2;
if (P_SL->data[mid] == data)
{
find = mid;
break; //如果找到直接退出循环
}
else if (P_SL->data[mid] > data)
{
//如果当前的值比查找的值大,就将尾部的下标移至mid的前一处
end = mid - 1;
}
else
{
//如果当前的值比需要找的值小,就将头部的下标移到mid的后一处
top = mid + 1;
}
}
if (find == -1)
{
printf("查找失败,此顺序表中没有该数据!\n");
}
else
{
printf("查找成功,%d在数组array里面 \n", data);
}
}
}