利用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); //插入
这两个声明错了,应该是InitList和InsList,要么你就改函数的定义,要么就改声明和使用的地方,大小写保持一致就行

qq_19701837
qq_19701837 我把两个的赏金都给你。
大约一年之前 回复
qq_19701837
qq_19701837 你把这个也发到我另外一个问题上可以吗
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐