当前位置:首页 > 算法 > 正文内容

顺序表算法应用

浩雨5年前 (2019-10-23)算法4822

利用顺序表数据类型解决实际问题,内容如下:

(1) 定义顺序表结构数组对象,最多能存100个数据;

(2) 调用创建函数初始化顺序表为1,5,96,45,3,6,4,88,7,36

(3) 调用输出函数,要求输出当前这个数据结构中的所有数据;

(4) 调用插入函数,要求在当前存放数据的第一个位置插入一个值为95的整型数据,并输出插入后的数据序列;

(5) 调用删除函数,要求删除当前存放数据中值为3的结点,并输出删除后的数据序列和删除的位置;

(6) 调用插入函数,要求在当前存放数据的值45后插入一个值为54的整型数据,并输出插入后的数据序列;

(7) 调用倒置函数,实现顺序表的就地倒置,并输出倒置后的数据。

(8) 调用奇偶分类函数,重新定义两个顺序表L1和L2,将偶数存放在L1中,奇数存放在L2中,并输出分类后的顺序表L1和L2的数据。

#include <stdio.h>
#include <stdlib.h>
#define MAXLEN 100
//定义顺序表的结构类型 
typedef int DataType;
typedef struct
{
    DataType data[MAXLEN];
    int Length;
}SeqList;
SeqList L;
//定义顺序初始化 
void InitList(SeqList *L){
    L->Length=0;
}
//定义顺序表创建函数 
void CreateList(SeqList *L,int n)
{
    int i;
    printf("请输入%d个整数: ",n);
    for(i=0;i<n;i++)
        scanf("%d",&L->data[i]);
    L->Length=i;
}
//查找操作 
int GetElem(SeqList *L,int i,DataType *x)
{
    if(i<1||i>L->Length)
        return 0;
    else
    {
        *x=L->data[i-1];
        return 1;
    }
}
int Locate(SeqList *L,DataType x)
{
    int i=0;
    while(i<L->Length && L->data[i]!=x)
        i++;
    if(i>=L->Length)
        return 0;
    else
        return i+1;
}
//插入操作 
int InsElem(SeqList *L,int i,DataType x)
{
    int j;
    if(L->Length>=MAXLEN){
        printf("顺序表已满");
        return -1;
    }
    if(i<1 || i>L->Length+1){
        printf("插入位置有误");
        return 0;
    }
    if(i == L->Length+1){
        L->data[i-1]=x;
        L->Length++;
        return 1;
    }
    for(j=L->Length-1;j>=i-1;j--)
        L->data[j+1]=L->data[j];
        L->data[i-1]=x;
        L->Length++;
        return 1;
}
//删除操作 
int DelElem(SeqList *L,int i,DataType *x){
    int j;
    if(L->Length==0){
        printf("顺序表为空");
        return 0;
    }
    if(i<1 || i>L->Length){
        printf("不存在第i个元素");
        return 0;
    }
    *x=L->data[i-1];
    for(j=i;j<L->Length;j++)
        L->data[j-1]=L->data[j];
    L->Length--;
    return 1;
}
//输出表中元素操作 
void DispList(SeqList *L){
    int i;
    for(i=0;i< L->Length;i++)
        printf("%5d ",L->data[i]);
}
//显示菜单函数 
void Menu()
{
        printf("\n       顺序表的各种操作");
        printf("\n==========================================");
        printf("\n|      1--建立顺序表                     |");
        printf("\n|      2--插入元素                       |");
        printf("\n|      3--删除元素                       |");
        printf("\n|      4--按位置查找元素                 |");
        printf("\n|      5--按元素值查找其在表中位置元素   |");
        printf("\n|      6--求顺序表的长度                 |");
        printf("\n|      7--倒置                           |");
        printf("\n|      8--奇偶分类                       |");
        printf("\n|      0--返回                           |");
        printf("\n==========================================");   
        printf("\n请输入菜单号(0-8):");
}
//倒置函数 
void reverse(SeqList* L) 
{
    int i = 0, j = L->Length - 1, temp = 0;
    while (i < j) {
        temp = L->data[i];
        L->data[i] = L->data[j];
        L->data[j] = temp;
        i++; j--;
    }
}
//奇偶分类函数(奇数在左,偶数在右)
void move(SeqList *L)
{
    int i=0,j=L->Length-1;
    DataType tmp;
    DataType data2[MAXLEN];
    while (i<j)
    {
        while ((i<j) && (L->data[j]%2==0))  //从右往左,找到第一个奇数
            j--;
        while ((i<j) && (L->data[i]%2==1))  //从左往右,找到第一个偶数
            i++;
        if (i<j)   //如果未到达"分界线",将右边的奇数和左边的偶数交换
        {
            tmp=L->data[i];
            L->data[i]=L->data[j];
            L->data[j]=tmp;
        }
    }   
}
main()
{
    SeqList L;
    DataType x;
    int n,i,loc;
    char ch1,ch2,a;
    ch1='y';
    while(ch1=='y'||ch1=='Y'){
        Menu();
        scanf("%c",&ch2);
        getchar();
        switch(ch2)
        {
        case '1':
                InitList(&L);
                printf("请输入建立线性表的个数:");
                scanf("%d",&n);
                CreateList(&L,n);
                printf("建立的线性表为:");
                DispList(&L);
                break;
        case '2':
                printf("请输入要插入的位置:");
                scanf("%d",&i);
                printf("请输入要插入的元素值:");
                scanf("%d",&x);
                if(InsElem(&L,i,x))
                {
                   printf("已成功在%d的位置插入%d,插入后的线性表为:\n",i,x);
                   DispList(&L);
                }
                else
                   printf("输入插入的参数错误");
                break;
        case '3':
                printf("请输入要删除元素的位置:");
                scanf("%d",&i);
                if(DelElem(&L,i,&x))
                {
                   printf("已成功在%d的位置删除%d,删除后的线性表为:\n",i,x);
                   DispList(&L);
                }
                else
                   printf("\n输入删除的参数错误");
                break;
        case '4':
                printf("请输入要查看表中元素位置(从1开始):");
                scanf("%d",&i);
                if(GetElem(&L,i,&x))
                   printf("当前线性表第%d个元素的值为:%d",i,x);
                else
                   printf("输入的位置错误");
                break;
        case '5':
                printf("请输入要查找的元素为:");
                scanf("%d",&x);
                loc=Locate(&L,x);
                if(loc)
                   printf("查找元素值为%d的位置为:%d",x,loc);
                else
                   printf("该表中无此元素");
                break;
        case '6':
                printf("当前线性表的长度为:%d",L.Length);
                break;
        case '7':
                reverse(&L);
                printf("倒置后的线性表为:");
                for (int i = 0; i < L.Length; i++) {
                   printf("%d ", L.data[i]);
                }
                return 0;
                break;
        case '8':
                move(&L);
                printf("操作后 ");
                for (int i = 0; i < L.Length; i++) {   
                   if(L.data[i]%2!=0)
                       printf("L2=%d\n", L.data[i]);
                   else{
                       printf("L1=%d\n", L.data[i]);
                   };
                };
                return 0;
                break; 
        case '0':
                ch1='n';
                break;
            default:
                printf("输入有误,请输入0-7进行选择");
        }
        if(ch2!='0')
        {
            printf("\n按回车键继续,按任意键返回主菜单\n");
            a=getchar();
            if(a!='\xA')
            {
                getchar();ch1='n';
            }
        }
    }
}



扫描二维码推送至手机访问。

版权声明:本文由我的FPGA发布,如需转载请注明出处。

本文链接:https://www.myfpga.cn/index.php/post/28.html

分享给朋友:

“顺序表算法应用” 的相关文章

常见算法的C语言实现(带题目、分析和答案) 穷举 递归 迭代 递推 分治 回溯 动态规划 贪心

常见算法的C语言实现(带题目、分析和答案) 穷举 递归 迭代 递推 分治 回溯 动态规划 贪心

1.1   基本思想1.1.1  穷举穷举(又称枚举)算法的基本思想是从所有可能的情况中搜索正确的答案。a)      题一查找数组中的两个元素,它们的和等于给定的目标值。给定一个包含 n 个整数的数组和一个目标值,找出...

(LeetCode刷题)1. 两数之和

(LeetCode刷题)1. 两数之和

题目解答一:/**  * Note: The returned array must be malloced, assume caller calls free(). &nbs...

(LeetCode刷题)2. 两数相加

(LeetCode刷题)2. 两数相加

题目解答一:简单实现思路:先遍历完两个链表,把各自的数字存入两个数组,然后对应位置的数相加,若结果大于10就进位到更高位的数。/**  * Definition for singly-linked list->  * s...

(LeetCode刷题)3. 无重复字符的最长子串

(LeetCode刷题)3. 无重复字符的最长子串

题目:解法一:class Solution(object):     def lengthOfLongestSubstring(self,s):        &nb...