首页 > 其他分享 >顺序表

顺序表

时间:2022-09-29 23:56:25浏览次数:37  
标签:顺序 last int item printf data

#include<stdio.h>
#include<iostream>
#include<algorithm>
#define _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_DEPRECATE
#pragma warning(disable:4996)
using namespace std;

#define MAXSIZE 1000
typedef int ElemType;
typedef struct
{
    ElemType data[MAXSIZE];
    int last;
}seqlist;

void PrintMenu()
{
    printf("欢迎进入顺序表操作系统!\n");
    printf("--------------------------------------------\n");
    printf("0.输出顺序表\n");
    printf("1.创建顺序表\n");
    printf("2.查找一个元素item在顺序表的位置\n");
    printf("3.在顺序表第i个位置插入一个元素item\n");
    printf("4.删除顺序表第i个位置的元素\n");
    printf("5.修改顺序表第i个位置的元素\n");
    printf("*******************************************\n");
    printf("6.对顺序表L排序\n");
    printf("7.在有序的顺序表中插入一个元素item\n");
    printf("8.合并有序表\n");
    printf("*******************************************\n");
    printf("9.求集合A和B的对称差集\n");
    printf("*******************************************\n");
    printf("10.输出系统菜单\n");
    printf("11.退出系统\n");
    printf("--------------------------------------------\n");
}

void print(seqlist L)//输出顺序表
{
    for (int i = 0; i < L.last; i++)
    {
        printf("%d ", L.data[i]);
    }
    printf("\n");
}

void create(seqlist* L)//创建顺序表
{
    printf("请输入顺序表的元素(ctrl+z结束输入):\n");
    int n = 0, x;
    while (~scanf("%d", &x)) {//while(scanf("%d",&x) == 1)  
        L->data[n] = x;
        n++;
    }
    L->last = n;
}

int find(seqlist L,ElemType item)//查找一个元素item在顺序表的位置,找不到返回-1
{
    for (int i = 0; i < L.last; i++)
    {
        if (item == L.data[i])
        {
            return i + 1;
        }
    }
    return -1;
}

int insert(seqlist* L, int n, ElemType item)//在顺序表的第i个位置插入一个元素item,插入成功返回1;失败返回-1  
{
    if (L->last == MAXSIZE || n < 1 || n > L->last - 1)
    {
        return -1;
    }

    for (int i = L->last-1; i >=n-1 ; i--)
    {
        L->data[i + 1] = L->data[i];
    }
    L->last++;
    L->data[n - 1] = item;
    return 1;
}

int del(seqlist*L,int n)//删除顺序表第n个位置的元素,失败为-1
{
    if (n > L->last || n < 0)
    {
        return - 1;
    }

    for (int j = n-1; j < L->last-1; j++)
    {
        L->data[j] = L->data[j + 1];
    }
    L->last--;
    return 1;
}

int modify(seqlist* L, int n, ElemType item)//改变顺序表第n个位置的元素,失败为-1
{
    if (n > L->last || n < 0)
    {
        return -1;
    }

    L->data[n-1] = item;
    return 1;
}

void listsort(seqlist* L)//对顺序表L排序
{
    int y;
    for(int i=1;i<L->last;i++)
    {
        for(int j=0;j<(L->last)-i;j++)
        {
            if(L->data[j]>L->data[j+1])
            {
                y=L->data[j];
                L->data[j]=L->data[j+1];
                L->data[j+1]=y;
            }
        }
    }    
}

void insertsorted(seqlist* L, ElemType item) //有序的顺序表中插入一个元素item
{
    for (int i = L->last - 1; i >= 0; i--)
    {
        if (item < L->data[i])
        {
            L->data[i + 1] = L->data[i];
        }
        else
        {
            L->data[i + 1] = item;
            break;
        }
    }

    if (item < L->data[0])
    {
        L->data[0] = item;
    }
    L->last++;

}
void mergeSorted(seqlist* L, seqlist *R , seqlist *M)//合并2个有序表L和R到新表M
{
    int n = L->last + R->last;
    M->last = n;
 
    for (int i = 0, j = 0, k = 0; k < n; k++)
    {
        if (i == L->last || j == R->last)
        {
            for (; j < R->last; j++)
            {
                M->data[i + j] = R->data[j];
            }
            for (; i < L->last; i++)
            {
                M->data[i + j] = L->data[i];
            }
            break;
        }

        if (L->data[i] <= R->data[j])
        {
            M->data[k] = L->data[i];
            i++;
            continue;
        }

        if (L->data[i] > R->data[j])
        {
            M->data[k] = R->data[j];
            j++;
            continue;
        }
    }
}

void gather(seqlist *s1,seqlist *s2)
{
    for(int i=0;i<s1->last;i++)
    {
        for(int j=0;j<s2->last;j++)
        {
            if(s1->data[i]==s2->data[j])
            {
                for(int k=i;k<s1->last-1;k++)
                {
                    s1->data[k]=s1->data[k+1];
                }
                i--;
                s1->last--;
                for(int k=j;k<s2->last-1;k++)
                {
                    s2->data[k]=s2->data[k+1];
                }
                j--;
                s2->last--;
            }
        }
    }
    
    for(int i=0;i<s2->last;i++)
    {
        int k=s1->last;
        s1->data[k]=s2->data[i];
        s1->last++;
    }
}

int main()
{
    PrintMenu();
    int choice, p, x;     //用户选择,位置,插入元素  
    ElemType item;
    seqlist L;         //初始化顺序表为空表  
    L.last = 0;        //空表长度为0

    //进入菜单循环   
    while (~scanf("%d", &choice))
    {
        switch (choice)
        {
        case 0: printf("0.输出顺序表\n");
            print(L);
            break;
            //**************************************/  
        case 1: printf("1.创建顺序表\n");
            create(&L);
            printf("创建成功,输出顺序表\n");
            print(L);
            break;
            //**************************************/  
        case 2: printf("2.查找一个元素item在顺序表的位置\n");
            scanf("%d", &item);
            if (find(L, item) == -1)
            {
                printf("查找失败\n");
            }
            else
                printf("元素在数据表中的位置是:%d\n", find(L, item));
            break;
            //**************************************/  
        case 3: printf("3.在顺序表第i个位置插入一个元素item\n");
            printf("请输入插入的位置和元素:");
            scanf("%d %d", &p,&x);
            if (insert(&L, p, x) == -1) {
                printf("插入失败!\n");
            }
            else {
                print(L);
            }
            break;
            //**************************************/  
        case 4:  printf("4.删除顺序表第i个位置的元素\n");
            printf("请输入要删除的位置:");
            cin >> item;
            if (del(&L, item) == -1)
            {
                printf("删除失败!\n");
            }
            else
                print(L);
            break;
            //**************************************/  
        case 5:  printf("5.修改顺序表第i个位置的元素\n");
            printf("请输入修改的位置和修改后的值:\n");
            scanf("%d %d",&p,&item);
            if (modify(&L, p, item) == -1)
                printf("修改失败!\n");
            else
            {
                printf("修改成功,输出顺序表\n");
                print(L);  
            }
            break;
            //**************************************/
        case 6:  printf("6.对顺序表sq排序\n");
            listsort(&L);
            printf("排序成功,输出顺序表\n");
            print(L);  
            break;
        case 7:  printf("7.在有序的顺序表中插入一个元素item\n");
            printf("请输入插入的元素:\n");
            cin >> item;
            insertsorted(&L, item);
            print(L);
            //**************************************/  
            break;
        case 8: printf("8.合并有序表\n");
                seqlist s1, s2, s3;
                printf("请输入2个有序表(务必从小到大排序):\n");
                create(&s1);
                create(&s2);
                mergeSorted(&s1, &s2, &s3);
                print(s3);
            //**************************************/  
            break;
        case 9: printf("请输入两个集合:\n");
                seqlist s11,s22;
                create(&s11);
                create(&s22);
                gather(&s11,&s22);
                print(s11);
            break;
        case 10:PrintMenu();
            return 0;
        case 11:printf("系统即将退出,欢迎再次使用!\n");
            break;
        default:
            printf("你的选择有误,请重新输入!\n");
        }
    }

    return 0;
}

 

标签:顺序,last,int,item,printf,data
From: https://www.cnblogs.com/BlueTeas/p/16743544.html

相关文章

  • C语言实现顺序栈、单链栈、双向链栈
    #defineMaxlength8/***数据结构类型:顺序栈*插入方法:尾插法*是否有头节点:否*说明:在主函数直接定义一个结构体节点,取地址作形参,避免使用malloc函数而考虑二......
  • 浏览器的事件处理顺序
    顺序为:主线程---->微任务---->别的事件队列微任务包括----->(promisemutationobserve)别的事件队列包括----->(setTimeout点击网络请求) demoOneconsole.log(......
  • C++ 内存模型与顺序一致性
    目录顺序一致性什么是内存模型?什么是顺序一致性?强顺序与弱顺序顺序一致性与内存模型的强弱顺序C++内存顺序(memory_order)memory_order有哪些?如何使用memory_order?顺序一致......
  • nginx lua 执行顺序
    不同阶段的顺序init>init_worker>set>rewrite>access>content>header>body>log同一个阶段下不同context执行优先级location>server>http......
  • [答疑]使用顺序图描述小刘给小王打一次电话的过程
    ​​重点文章:CTO也糊涂的常用术语:功能模块、业务架构、用户需求……[20210217更新]>>​​2013-05-0916:49:55chris(1311***268)潘老师麻烦您帮我看看这个题对么?例题:使用顺......
  • mysql语句执行顺序
    mysql中的查询优化器根据"解析树"生成最优的执行计划,可以分为两类:静态优化,动态优化        先给出sql简单的执行顺序 这里表示where的执行顺序在sele......
  • 反转字符串,单词按内部字符顺序输出
      conststr="Ilikeyou,butyoudon'tknow,I'msad."functionstrReverse(str){conststrList=str.split(',').reverse()strList.fo......
  • 【code基础】顺序数组的去重
    掌握顺序数组的去重,对后续算法的去重剪枝,降低时间复杂度很有用,其基本思路如下:1.双指针,k和i。其中k指向不重复的位置,i为数组的遍历指针2.对数组进行遍历,其中i可以从1开......
  • 直播电商平台开发,顺序循环图片切换
    直播电商平台开发,顺序循环图片切换1.body <divclass="box">    <divclass="btnbox">    <buttonclass="active">顺序播放</button>    <bu......
  • 从键盘输入三个整数x,y和z,按从大到小的顺序输出它们的值。
    #include<stdio.h>intmain(){intx,y,z,t;scanf("%d%d%d",&x,&y,&z);if(x<y){t=x;x=y;y=t;}if(x<z){t=x;x=z......