qq_19701837 2019-03-28 18:35 采纳率: 70%
浏览 326
已采纳

利用c语言,写出顺序列表完成基础功能()

帮忙看看吧

 #include <stdio.h>

#define MaxSize 100 

typedef int ElemType;
typedef struct list
{ 
  ElemType elem[MaxSize];
  int last;                 //定义最后一个数 
}list;                          //定义一个类型 
//功能包括:创建,初始化,插入,删除,访问,定位访问,合并,输出 

void sort(list *L);
void CreList(list*l,int n);             //创建 
void Initlist (list*L);             //初始化                             
int Inslist(list*L,int i,ElemType e);           //插入 
int DelList  (list*L,int i);            //删除 
int Locate(list*l,ElemType e);      //查找
int CombList (list *L1,list *L2,list *L3);
int AccLink (list *L,int i);        //顺序访问
void DispList (list *L);                //输出顺序表

int main (void)
{

    list L1,L2,L3;
    int cho,size,temp1,temp2;

    do
    {
        printf("请您创建一个顺序列表\n");
        printf("请输入列表的长度(长度需要小于最大长度(MaxSize):");
        scanf("%d",&size);
        printf("输入列表的元素:");
        Initlist(&L1);              //进行初始化 
        CreList(&L1,size);  
    }while(size<=0 || size>MaxSize);            //检测长度定义的列表是否超过最大值 

    do
    {
        printf("以下为可以进行的操作~\n");
        printf("1_访问列表中某一个指定位置的元素\n");
        printf("2_查找列表中某一个元素的所在位置\n");
        printf("3_在列表中插入一个元素\n");
        printf("4_从列表中删除一个元素\n");
        printf("5_初始化列表\n");
        printf("6_合并第二序列列表\n");
        printf("请进行选择:");
        scanf("%d",&cho);
    }while (cho>6 || cho<1);                //对非法输入进行对策 

    switch(cho)
    {
        case 1:
                printf("请输入位置:");
                scanf("%d",&temp1);
                AccLink(&L1,temp1);
                break;

        case 2: printf("请输入元素:");
                scanf("%d",&temp1);
                temp1 = Locate(&L1,temp1);
                printf("该位置的元素是 %d\n",temp1);
                break;

        case 3: printf("请您输入要插入元素的位置和元素:");
                scanf("%d %d",&temp1,&temp2);
                Inslist (&L1,temp1,temp2);
                printf("目前列表为:");
                DispList(&L1);
                puts("");
                break;

        case 4: printf("请输入要删除元素所在的位置:");
                scanf("%d",&temp2);
                temp1 = DelList (&L1,temp2);
                printf("您删除的元素是%d\n",temp1);
                printf("目前列表是:");
                DispList(&L1);
                puts("");
                break;

        case 5: Initlist (&L1);
                break;

        case 6: puts("请输入列表的长度(小于最大长度 Maxsize)");
                scanf("%d",&size);
                puts("请现在输入元素:");
                CreList(&L2,size);
                puts("确定要合并两个列表吗?(将两个列表按升序排列)");
                puts("1)Yes\t2)No");
                printf("你的选择是:");

                do
                {
                    scanf("%d",&cho);
                }while (cho <1 || cho>2);

                switch (cho)
                {
                    case 1:
                            CombList(&L1,&L2,&L3);
                            printf("经过组合后的列表为:");
                            DispList(&L3);
                            break;

                    case 2: DispList(&L1);
                            puts("");
                            DispList(&L2);
                            return 0;
                            break;
                }
                break;

        default:puts("您输入的有错误!");
                return 0;
        }

    return 0;
    }

void CreList (list *L,int n)    //创建一个n个元素的顺序列表 
{
    int i;

    for (i=0;i<n;i++)
    {
        scanf ("%d",&L->elem[i]);
        L->last = n-1;
    }
}
void InitList (list *L)     //初始化顺序表为空表
{
    L->last = -1;
}

int InsList (list *L,int i,ElemType e)  //此函数用于在顺序表中插入元素
{
    int k;

    if (L->last == MaxSize-1)
    {
        printf("存储空间已满,无法执行“添加”操作");
        return 0;
    }
    if (!(i>=1 && i<=L->last+2))
    {
        puts("位置输入不合法");
        return 0;
    }

    for (k=L->last;k>=i-1;k--)  //将“目标位置”后的元素依次后移
    {
        L->elem[k+1] = L->elem[k];
    }
    L->elem[i-1] = e;           //将“目标元素”插入到目标位置
    L->last++;

    return 1;

}
int DelList (list *L,int i)
{
    int k;
    ElemType temp;

    if (L->last == -1)
    {
        puts("此顺序表为空,无法执行“删除”操作");
        return 0;
    }
    if (!(i>=1 && i<=L->last+1))
    {
        puts("删除位置不合法");
        return 0;
    }

    temp = L->elem[i-1];    //将删除的元素保存,便于用户核对

    for(k=i-1;k<=L->last;k++)   //将被删除元素后的元素依次前移一位
    {
        L->elem[k] = L->elem[k+1];
    }
    L->last--;

    return temp;
}

int Locate (list *L,ElemType e) //此函数通过给定元素值来查找其位置
{
    int i;

    if (L->last == -1)
    {
        puts("此顺序表为空,无法执行“查找”操作");
        return 0;
    }

    for (i=0;i<L->last;i++)
    {
        if (L->elem[i] == e)
        {
            return i+1;
        }
    }

    return 0;
}
int CombList (list *L1,list *L2,list *L3)
{
    int size,i,j,k;

    if (L1->last + L2->last + 2 >=MaxSize)
    {
        puts("合并后的顺序表长度超出单顺序表上限,无法执行“合并”操作");
        return 0;
    }

    size = L1->last + L2->last + 2;     //确定顺序表L3的大小

    sort(L1);
    sort(L2);
    InitList(L3);       //初始化顺序表L3
    for (i=0,j=0,k=0;k<size;k++)
    {
        if (L1->elem[i] < L2->elem[j])
        {
            InsList (L3,k+1,L1->elem[i++]);     //将L1->elem[i]插入L3

            if (i>L1->last)                     //L1全部插入L3后将L2中的剩余元素依次插入L3
            {
                for (;k<size-1;k++)
                {
                    InsList (L3,k+2,L2->elem[j++]);
                }
            }
        }
        else
        {
            InsList (L3,k+1,L2->elem[j++]);     //将L2->elem[j]插入L3

            if (j>L2->last)                     //L2全部插入L3后将L1中的剩余元素依次插入L3
            {
                for (;k<size-1;k++)
                {
                    InsList (L3,k+2,L1->elem[i++]);
                }
            }
        }
    }

    L3->last = k-1;

    return 1;
}

int AccLink (list *L,int i) //此函数通过位置来访问顺序表中的元素
{
    if (i > L->last+1)
    {
        puts("输入位置不合法");
        return 0;
    }
    printf("位置元素 %d 是 %d",i,L->elem[i-1]);
    return 1;
}
void DispList (list *L) //此函数用于打印顺序表
{
    int i;
    for (i=0;i<=L->last;i++)
    {
        printf ("%d ",L->elem[i]);
    }
}

void sort(list *L)  //此函数使用冒泡法将顺序表从小到大进行排序
{
    int i,j;
    ElemType temp;

    for (i=0;i<=L->last;i++)
    {
        for (j=0;j<=L->last-1;j++)
        {
            if (L->elem[j] > L->elem[j+1])
            {
                temp = L->elem[j];
                L->elem[j] = L->elem[j+1];
                L->elem[j+1] = temp;
            }
        }
    }
}

*告诉我怎么解决

  • 问题在哪
  • 速度
  • 写回答

1条回答

  • DRACULAX05 2019-03-28 18:38
    关注

    void Initlist (list*L); //初始化

    int Inslist(list*L,int i,ElemType e); //插入
    声明和定义的大小写不一致,C/C++是区分大小写的,请保持两边一致

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 优质github账号直接兑换rmb,感兴趣伙伴可以私信
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办
  • ¥15 Python爬取指定微博话题下的内容,保存为txt
  • ¥15 vue2登录调用后端接口如何实现
  • ¥65 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)