圣狄雅哥 发表于 2017-11-29 21:06:55

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

#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;
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;

    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 = L->data;
      }
    }

    L->data = 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;

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

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

    return OK;
}

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

void listoutput(sqlist*L)
{
        int i;
        for(i=0;i<L->length;i++)
                printf(" %d",L->data);
        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.data<L.data)
                           min=j;
                if(min!=i)
                {
                        temp=L;
                        L=L;
                        L=temp;
                }
        }
}

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

void main()
{
        sqlist L;
        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);
                }
        }
}















圣狄雅哥 发表于 2017-11-29 21:09:53

程序中对线性表所有数据元素从小到大排序的那个函数运行时不能实现他的功能,还偶尔出错,但编译可以通过,有大佬帮忙分析分析,谢谢。
页: [1]
查看完整版本: 仿照小甲鱼写16讲的单链表的方式自己整理和补充了顺序存储结构的线性表的一些操作