乔治爱啃脚趾 发表于 2023-9-20 21:57:01

数据结构顺序表问题

#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);
                L->length++;
        }
        printf("顺序表创建成功\n");

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

}
void listinsert(sqlist *L,int i,elemtype e)
{
        int *p,*q;
        printf("请输入你要插入的数字\n");
        scanf("%d",&e);
        printf("请输入你要插入的位置\n");
        scanf("%d",&i);
        q=&(L->elem);
        if(i<1||i>L->length)
        {
                printf("error!");
        }
        else
        {
                for(p=&(L->elem);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=L->elem;
                }
                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)
                        {
                                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那里。

isdkz 发表于 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);

    elemtype *q = &(L->elem);

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

    while (p < &(L->elem)) {

      *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) {

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

      }

    }

    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. 最后,更新顺序表的长度。

乔治爱啃脚趾 发表于 2023-9-20 22:11:10

isdkz 发表于 2023-9-20 21:57
代码中存在一些问题,具体如下:



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

这个最后还需要排个序,排成递增的
页: [1]
查看完整版本: 数据结构顺序表问题