鱼C论坛

 找回密码
 立即注册
查看: 2388|回复: 1

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

[复制链接]
发表于 2017-11-29 21:06:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

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















想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-11-29 21:09:53 | 显示全部楼层
程序中对线性表所有数据元素从小到大排序的那个函数运行时不能实现他的功能,还偶尔出错,但编译可以通过,有大佬帮忙分析分析,谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 19:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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