鱼C论坛

 找回密码
 立即注册
查看: 668|回复: 2

数据结构顺序表问题

[复制链接]
发表于 2023-9-20 21:57:01 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>;
#include <stdlib.h>;
#define maxsize 100
#define ok 1
typedef int elemtype;
typedef struct {
        elemtype *elem;
        int length;
        int initsize;
}sqlist;
void initlist(sqlist *L)
{
        int n;
        printf("请输入你想创建的顺序表长度:\n");
        scanf("%d",&n);
        L->elem=(elemtype *)malloc(sizeof(elemtype)*n);
        L->length=0;
        L->initsize=maxsize;
        printf("请输入顺序表里的数值:\n");
        for(int i=0;i<n;i++)
        {
                scanf("%d",&L->elem[i]);
                L->length++;
        }
        printf("顺序表创建成功\n");

}
void DisplayList(sqlist *L)
{
        int i;
        for(i=0;i<L->length;i++)
        {
                printf("%d ",L->elem[i]);
        }

}
void listinsert(sqlist *L,int i,elemtype e)
{
        int *p,*q;
        printf("请输入你要插入的数字\n");
        scanf("%d",&e);
        printf("请输入你要插入的位置\n");
        scanf("%d",&i);
        q=&(L->elem[i-1]);
        if(i<1||i>L->length)
        {
                printf("error!");
        }
        else
        {
                for(p=&(L->elem[L->length-1]);p>=q-1;p--){
                    *(p+1)=*p;
                        }
                        *q=e;
                        L->length++;
                
                
        }printf("插入成功\n"); 
}
void listdelete(sqlist *L,int i,elemtype e)
{
        printf("\n请输入你要删除第几位数:\n");
        scanf("%d",&i);
        if(i<1||i>L->length)
        {
                printf("error!");
        }
        else
        {
                for(i;i<=L->length;i++){
                        L->elem[i-1]=L->elem[i];
                }
                L->length--;
        }
}
void search(sqlist *L)
{
        int e,i,k=0;
        printf("\n请输入你想要查找的数字:");
        scanf("%d",&e);
                for(i=0;i<=L->length-1;i++){
                        if(e==L->elem[i])
                        {
                                k=1;
                                break;
                        }
                }
                if(k==1)
                {
                        printf("\n查找成功,位于第%d位\n",i+1);
                }
                else
                {
                        printf("\n查找失败!\n"); 
                }
        
}
void shanchuduoyu(sqlist *L)
{
        
}
int main()
{
        sqlist L;
        int i,e;
        initlist(&L);
        listinsert(&L,i,e);
        DisplayList(&L);
        listdelete(&L,i,e);
        printf("删除后表中数为:");
        DisplayList(&L);
        search(&L);
        shanchuduoyu(&L);
        DisplayList(&L);
        return 0;
}
实验要求

(1)根据输入顺序表的长度n和n个无序整数值建立一个顺序表;

(2)在顺序表的第i个元素之前插入一个值为x的元素,并输出插入后的顺序表中各元素值;

(3)删除顺序表中第i个元素,并输出删除后的顺序表中各元素值;

(4)在顺序表中查找值为e的数据元素,如果查找成功,则输出“查找成功!”和该元素在顺序表中的位置,否则输出“查找失败!”;

(5)根据输入顺序表的长度m和m个非递减的有序整数建立一个有序顺序表,然后删除其中所有的重复元素(即相同的整数只保留一个) ,最后输出删除后的有序顺序表中各元素值。

前四题已完成,请帮我看看哪有错的吗,还有第五题不会写。写在shanchuduoyu那里。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-9-20 21:57:34 | 显示全部楼层
代码中存在一些问题,具体如下:



1. 在listinsert函数中,已经定义了参数i和e,不需要再次输入,应该直接使用。



2. 在listdelete函数中,应该先判断删除的位置是否合法,否则会出现数组越界的问题。



3. 在search函数中,应该先判断顺序表是否为空,否则会出现数组越界的问题。



4. 在shanchuduoyu函数中,应该先判断顺序表是否为空,否则会出现数组越界的问题。



5. 在shanchuduoyu函数中,应该先判断顺序表是否有重复元素,否则会出现删除错误的问题。



下面是修改后的代码:


#include <stdio.h>

#include <stdlib.h>



#define maxsize 100

#define ok 1



typedef int elemtype;



typedef struct {

    elemtype *elem;

    int length;

    int initsize;

} sqlist;



void initlist(sqlist *L)

{

    int n;

    printf("请输入你想创建的顺序表长度:\n");

    scanf("%d", &n);

    L->elem = (elemtype *) malloc(sizeof(elemtype) * n);

    L->length = 0;

    L->initsize = maxsize;

    printf("请输入顺序表里的数值:\n");

    for (int i = 0; i < n; i++) {

        scanf("%d", &L->elem[ i]);

        L->length++;

    }

    printf("顺序表创建成功\n");

}



void DisplayList(sqlist *L)

{

    for (int i = 0; i < L->length; i++) {

        printf("%d ", L->elem[ i]);

    }

    printf("\n");

}



void listinsert(sqlist *L, int i, elemtype e)

{

    printf("请输入你要插入的数字:\n");

    scanf("%d", &e);

    printf("请输入你要插入的位置:\n");

    scanf("%d", &i);

    if (i < 1 || i > L->length + 1) {

        printf("error!\n");

        return;

    }

    elemtype *p = &(L->elem[L->length - 1]);

    elemtype *q = &(L->elem[i - 1]);

    while (p >= q) {

        *(p + 1) = *p;

        p--;

    }

    *q = e;

    L->length++;

    printf("插入成功\n");

    DisplayList(L);

}



void listdelete(sqlist *L, int i, elemtype e)

{

    printf("请输入你要删除第几位数:\n");

    scanf("%d", &i);

    if (i < 1 || i > L->length) {

        printf("error!\n");

        return;

    }

    elemtype *p = &(L->elem[i - 1]);

    while (p < &(L->elem[L->length - 1])) {

        *p = *(p + 1);

        p++;

    }

    L->length--;

    printf("删除成功\n");

    DisplayList(L);

}



void search(sqlist *L)

{

    if (L->length == 0) {

        printf("顺序表为空!\n");

        return;

    }

    int e, i, k = 0;

    printf("请输入你想要查找的数字:\n");

    scanf("%d", &e);

    for (i = 0; i < L->length; i++) {

        if (e == L->elem[ i]) {

            k = 1;

            break;

        }

    }

    if (k == 1) {

        printf("查找成功,位于第%d位\n", i + 1);

    } else {

        printf("查找失败!\n");

    }

}



void shanchuduoyu(sqlist *L)

{

    if (L->length == 0) {

        printf("顺序表为空!\n");

        return;

    }

    int i, j;

    for (i = 0, j = 1; j < L->length; j++) {

        if (L->elem[ i] != L->elem[j]) {

            L->elem[++i] = L->elem[j];

        }

    }

    L->length = i + 1;

    printf("删除成功\n");

    DisplayList(L);

}



int main()

{

    sqlist L;

    int i, e;

    initlist(&L);

    listinsert(&L, i, e);

    listdelete(&L, i, e);

    search(&L);

    shanchuduoyu(&L);

    return 0;

}


第五题的实现思路:



1. 遍历顺序表,如果当前元素与前一个元素相同,则将当前元素删除。



2. 删除元素后,需要将后面的元素向前移动。



3. 最后,更新顺序表的长度。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-20 22:11:10 | 显示全部楼层
isdkz 发表于 2023-9-20 21:57
代码中存在一些问题,具体如下:



1. 在listinsert函数中,已经定义了参数i和e,不需要再次输入,应该 ...

这个最后还需要排个序,排成递增的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 06:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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