QQ登录

只需一步,快速开始

登录 | 立即注册 | 找回密码

主题

帖子

荣誉

VIP至尊会员

Rank: 15Rank: 15Rank: 15

积分
28
查看: 122|回复: 1

[技术交流] 仿照小甲鱼写16讲的单链表的方式自己整理和补充了顺序存储结构的线性表的一些操作

[复制链接]
最佳答案
0 
累计签到:4 天
连续签到:1 天
圣狄雅哥 发表于 2017-11-29 21:06:55 1221 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
#include <stdio.h>
#include <stdlib.h>
#include<time.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20   

typedef int ElemType;
typedef int Status;
typedef struct
{
ElemType data[MAXSIZE];
int length;    // 线性表当前长度
} sqlist;

// 初始条件:顺序线性表L已存在,1 <= i <= ListLength(L)
// 操作结果:用e返回L中第i个数据元素的值
Status GetElem(sqlist *L, int i, ElemType *e)
{
    if( L->length==0 || i<1 || i>L->length )
    {
        return ERROR;
    }
    *e = L->data[i-1];

    return OK;
}

// 初始条件:顺序线性表L已存在,1<= i <= ListLength(L)
// 操作结果:在L中第i个位置之前插入新的数据元素e,L长度+1

Status ListInsert(sqlist *L, int i, ElemType e)
{
    int k;

    if( L->length == MAXSIZE )  // 顺序线性表已经满了
    {
        return ERROR;
    }
    if( i<1 || i>L->length+1)   // 当i不在范围内
    {
        return ERROR;
    }
    if( i <= L->length )   // 若插入数据位置不在表尾
    {
        // 将要插入位置后数据元素向后移动一位
        for( k=L->length-1; k >= i-1; k-- )
        {
            L->data[k+1] = L->data[k];
        }
    }

    L->data[i-1] = e;  // 将新元素插入
    L->length++;

    return OK;
}

/* 初始条件:顺序线性表L已存在,1<=i<=ListLength(L) */
/* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度-1 */
Status ListDelete(sqlist *L, int i, ElemType *e)
{
    int k;

    // 判断是否是空表
    if( L->length == 0 )
    {
        return ERROR;
    }
    // 判断删除元素位置是否不合法
    if( i<1 || i>L->length )
    {
        return ERROR;
    }

    // 数组从0开始,i位置对应索引-1,记住
    *e = L->data[i-1];

    if( i < L->length )
    {
        // 循环,向前移动1位
        for( k=i; k < L->length; k++ )
        {
            L->data[k-1] = L->data[k];
        }
    }

    // 删除一次成功,表长减1
    L->length--;

    return OK;
}

void creatlist(sqlist *L,int n)
{
        int i;
        srand(time(0));
        for(i=0;i<n;i++)
        {
                L->data[i]=rand()%100+1;
        }
        L->length=n;
}

void listoutput(sqlist*L)
{
        int i;
        for(i=0;i<L->length;i++)
                printf(" %d",L->data[i]);
        printf("\n");
}

void listSelectSort(sqlist*L)    // 这个函数语法和逻辑看似没有问题,运行时却不能实现对线性表元素的排序,原因不明
{
        int i,j,min;
        sqlist temp;
        for(i=0;i<L->length-1;i++)
        {
                min=i;
                for(j=i+1;j<L->length;j++)
                   if(L[j].data<L[i].data)
                           min=j;
                if(min!=i)
                {
                        temp=L[i];
                        L[i]=L[j];
                        L[j]=temp;
                }
        }
}

Status getmidnode(sqlist*L)
{
        int f,e;
        e=(int)L->length/2;
        f=L->data[e];
        printf("%d\n",f);
        return OK;
}

void main()
{
        sqlist L[MAXSIZE];
        int n,opp,i,m;
        ElemType e;
        printf("\n 1.创建线性表\n 2.查看线性表\n 3.所有元素从小到大进行排序\n 4.线性表中间元素\n 5.查看线性表中某一元素的值\n 6.插入元素\n 7.删除元素\n 0.退出\n 请输入你的选择\n");
        while(opp)
        {
                scanf("%d",&opp);
                switch(opp)
                {
                case 1:
                        printf("输入要创建的线性表的元素个数(不超过20个):\n");
                        scanf("%d",&n);
                        if(n>20||n<1)
                        {
                                printf("请重新输入:\n");
                                scanf("%d",&n);
                        }
                        creatlist(L,n);
                        listoutput(L);
                        printf("\n");
                        break;
                case 2:
                        listoutput(L);
                        printf("\n");
                        break;
                case 3:
                        printf("所有元素从小到大排列为:\n");
                        listSelectSort(L);
                        listoutput(L);
                        printf("\n");
                        break;
                case 4:
                        getmidnode(L);
                        printf("\n");
                        break;
                case 5:
                        printf("输入要查看的元素的位置:\n");
                        scanf("%d",&i);
                        GetElem(L,i,&e);
                        printf("该位置的元素为:%d\n",e);
            printf("\n");
            break;
                case 6:
                        printf("请输入要插入的位置(1<=i<=20):\n");
                        scanf("%d",&i);
                        printf("请输入要插入的元素:\n");
                        scanf("%d",&m);
                        ListInsert(L,i,m);
                        listoutput(L);
                        printf("\n");
                        break;
                case 7:
                        printf("请输入你要删除的元素的位置(1<=i<=20):\n");
                        scanf("%d",&i);
                        ListDelete(L,i,&e);
                        printf("删除的元素为:%d\n", e);
                        listoutput(L);
                        printf("\n");
                        break;
                case 0:
                        exit(0);
                }
        }
}















楼层
跳转到指定楼层
最佳答案
0 
累计签到:4 天
连续签到:1 天
圣狄雅哥  楼主| 发表于 2017-11-29 21:09:53 | 显示全部楼层
程序中对线性表所有数据元素从小到大排序的那个函数运行时不能实现他的功能,还偶尔出错,但编译可以通过,有大佬帮忙分析分析,谢谢。

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐 上一条 /2 下一条

    移动客户端下载(未启用)
    微信公众号

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备11014136号

Copyright 2018 鱼C论坛 版权所有 All Rights Reserved.

Powered by Discuz! X3.1 Copyright
© 2001-2018 Comsenz Inc.    All Rights Reserved.

小黑屋|手机版|Archiver|鱼C工作室 ( 粤公网安备 44051102000370号 | 粤ICP备11014136号

GMT+8, 2017-12-18 13:15

快速回复 返回顶部 返回列表