利用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个回答

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

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!

相似问题

1
硬件设计-电子秤用C语言怎么写
3
关于嵌入式操作系统的一个题目,编写一个c语言程序,其功能是将一个文本文件读出,然后再反序写回。
1
c语言建立有序顺序表时遇到了问题,求大家指点
3
【C语言编写函数问题】从键盘输入一个浮点数,编写程序完成 如下功能:
0
一个使用C语言模拟桌游策略纸牌的游戏,规则详见下面,怎么利用C语言解决
1
c语言如何生成(0,1)之间均匀分布的随机数?
2
c语言 输出直接显示press any key to continue
1
怎么用c语言把数据以表格方式写到pdf中
3
c语言:输入3个字符串,按由小到大的顺序输出,为什么输出有问题
1
LC977. 有序数组的平方 C语言
1
leetcode 977. 有序数组的平方 C语言
0
数列整数相邻判断的问题,如何利用C语言的功能去实现的
0
给定的数字列表构成哪些表达式的问题,如何利用C语言的形式的办法解决
0
如何利用C语言编程实现对数列的搜索问题,采用C语言代码的编写的方式是怎么做?
2
求教大佬,用C语言写出所有三位数的水仙花数,我用了pow函数,结果少输了一个水仙花数
2
萌新求解!!!!!vs2017写c语言,函数参数间不能传址吗?
2
c语言在利用typedef时的一个奇怪的现象
0
农夫的过河的顺序的问题,怎么利用C语言的程序的设计来解决的?
1
先判断是否是质数然后统计个数的问题怎么利用C语言程序写的办法来实现
1
利用c语言,写出顺序列表完成基础功能()