首页 > 编程语言 >C语言 (数据结构)在顺序表中用二分查找和冒泡排序算法

C语言 (数据结构)在顺序表中用二分查找和冒泡排序算法

时间:2022-12-12 16:47:46浏览次数:67  
标签:void SL 冒泡排序 C语言 length 表中用 printf data SequenceList

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);
        }
    }
}

标签:void,SL,冒泡排序,C语言,length,表中用,printf,data,SequenceList
From: https://www.cnblogs.com/smartlearn/p/16976432.html

相关文章