试着写了一个顺序表,为什么会出现这种情况,以及还有哪些问题

img


//main.c
#include<stdio.h>
#include<stdlib.h>
#include"list .h"
/*
void CreateList(SqList *L,int n);    //创建顺序表
void InitList(SqList *L);    //初始化顺序表
void InsertList(SqList *L, int index, elem e);    //在index处插入
void ListDelete(SqList *L, int index);    //删除index处元素
int LocteElem(SqList *L, elem e);    //查找数据e在顺序表里的位置
void GetElem(SqList* L, int index);   //输出index处的值
typedef struct data {
    int expn;//指数
    double coef;//系数
}elem;
typedef struct {

}SqList;    elem* data;//数据
    int length;//表长
*/
int main()
{
    SqList* k=NULL;
    CreateList(k, 5);
    return 0;
}


//list.h
#define MAXSIZE 100
typedef struct data {
    int expn;//指数
    double coef;//系数
}elem;
typedef struct {
    elem* data;//数据
    int length;//表长
}SqList;
void CreateList(SqList *L,int n);    //创建顺序表
void InitList(SqList *L);    //初始化顺序表
void InsertList(SqList *L, int index, elem e);    //在index处插入
void ListDelete(SqList *L, int index);    //删除index处元素
int LocteElem(SqList *L, elem e);    //查找数据e在顺序表里的位置
void GetElem(SqList* L, int index);   //输出index处的值


//list.c
#include<stdlib.h>
#include<stdio.h>
#include"list .h"
#ifndef _LIST_H_
#define _LIST_H_
/*
typedef struct data {
    int expn;//指数
    double coef;//系数
}elem;
typedef struct {
    elem* data;//数据
    int length;//表长
}SqList;
*/
void CreateList(SqList* L, int n) {
        L = (elem*)malloc(MAXSIZE * sizeof(elem));
        for (int i = 0; i < n; i++) {
            printf("请按先后输入指数和系数:\n");
            scanf("%d %lf",L->data[i].expn,L->data[i].coef);
            L->length++;
        }
}
void InitList(SqList* L) {
    L = (elem*)malloc(MAXSIZE * sizeof(elem));
    L->length = 0;
}
void InsertList(SqList* L, int index, elem e) {
    if (index > (L->length + 1) || index < 1||L->length==MAXSIZE) {
        printf("ERROR\n");
    }
    else {
        for (int i = L->length - 1; i > index - 1; i--) {
            L->data[i + 1] = L->data[i];
        }
        L->data[index - 1] = e;
        L->length++;
    }
}
void ListDelete(SqList* L, int index) {
    if (index > L->length || index < 1) {
        printf("ERROR\n");
    }
    else {
        for (int i = index-1; i < L->length - 1; i++) {
            L->data[i] = L->data[i + 1];
        }
        L->length--;
    }
}
int LocteElem(SqList* L, elem e) {
    int isPrime = 0;
    for (int i = 0; i < L->length - 1; i++) {
        if (e.expn == L->data[i].expn&&e.coef==L->data[i].coef) {
            printf("该元素位于第%d位\n", i + 1);
            isPrime = 1;
            break;
        }
    }
    if (!isPrime) {
        printf("表中无元素\n");
    }
}
void GetElem(SqList* L, int index) {
    if (index<1 || index>L->length) {
        printf("ERROR\n");
    }
    else {
        printf("指数为%d  系数为%lf\n", L->data[index - 1].expn, L->data[index - 1].coef);
    }
}
#endif

修改后运行结果:

img

main.c代码:

#include "list.h"
#include <stdio.h>
int main()
{
    SqList k ;
    int pos;
    elem e;
    InitList(&k); //这里先初始化链表
    CreateList(&k, 5);
    ShowList(&k);
    //插入
    printf("请输入需要插入的位置和数据:");
    scanf("%d %d %lf", &pos, &e.expn, &e.coef);
    InsertList(&k, pos, e);
    printf("插入后链表:\n");
    ShowList(&k);
    //删除
    printf("请输入需要删除的位置:");
    scanf("%d", &pos);
    ListDelete(&k, pos);
    printf("删除后链表:\n");
    ShowList(&k);


    return 0;
}


list.h代码:

#define _CRT_SECURE_NO_WARNINGS 1

#ifndef _LIST_H_
#define _LIST_H_


#define MAXSIZE 100
typedef struct data {
    int expn;//指数
    double coef;//系数
}elem;
typedef struct {
    elem* data;//数据
    int length;//表长
}SqList;
void CreateList(SqList* L, int n);    //创建顺序表
void InitList(SqList* L);    //初始化顺序表
void InsertList(SqList* L, int index, elem e);    //在index处插入
void ListDelete(SqList* L, int index);    //删除index处元素
int LocteElem(SqList* L, elem e);    //查找数据e在顺序表里的位置
void GetElem(SqList* L, int index);   //输出index处的值

void ShowList(SqList* L); //显示链表

#endif

list.c代码:

#include "list.h"
#include <stdio.h>
#include <stdlib.h>
void CreateList(SqList* L, int n) {
    //L = (elem*)malloc(MAXSIZE * sizeof(elem)); //修改  已经有InitList函数了,这里就不需要再申请内存了
    for (int i = 0; i < n; i++) {
        printf("请按先后输入指数和系数:\n");
        scanf("%d %lf", &L->data[i].expn, &L->data[i].coef); //修改  读数据需要用地址
        //L->length++; 
    }
    L->length = n; //再这里直接赋值就可以了
}
void InitList(SqList* L) {
    L->data = (elem*)malloc(MAXSIZE * sizeof(elem));// 修改 L = (elem*)malloc(MAXSIZE * sizeof(elem));
    L->length = 0;
}
void InsertList(SqList* L, int index, elem e) {
    if (index > (L->length + 1) || index < 1 || L->length == MAXSIZE) {
        printf("ERROR\n");
    }
    else {
        for (int i = L->length - 1; i >= index - 1; i--) //修改  这里是i >= index -1,否则 index-1位置处的数据无法后移
            L->data[i + 1] = L->data[i];
    }
    L->data[index - 1] = e;
    L->length++;
}


void ListDelete(SqList* L, int index) {
    if (index > L->length || index < 1) {
        printf("ERROR\n");
    }
    else {
        for (int i = index - 1; i < L->length - 1; i++) {
            L->data[i] = L->data[i + 1];
        }
        L->length--;
    }
}
int LocteElem(SqList* L, elem e) {
    int isPrime = 0;
    for (int i = 0; i < L->length - 1; i++) {
        if (e.expn == L->data[i].expn && e.coef == L->data[i].coef) {
            printf("该元素位于第%d位\n", i + 1);
            isPrime = 1;
            break;
        }
    }
    if (!isPrime) {
        printf("表中无元素\n");
    }
    return isPrime;
}
void GetElem(SqList* L, int index) {
    if (index<1 || index>L->length) {
        printf("ERROR\n");
    }
    else {
        printf("指数为%d  系数为%lf\n", L->data[index - 1].expn, L->data[index - 1].coef);
    }
}

void ShowList(SqList* L)
{
    int i;
    for (i = 0; i < L->length; i++)
    {
        printf("(%d,%lf) ", L->data[i].expn ,L->data[i].coef);
    }
    printf("\n");
}

输入要取地址,改为:
scanf("%d %lf",&(L->data[i].expn),&(L->data[i].coef));
另外在for循环之前,加上 L->length = 0; 长度需要初始化为0

#include <stdio.h>
#define MAXSIZE 100
typedef struct data {
    int expn;//指数
    double coef;//系数
}elem;
typedef struct {
    elem* data;//数据
    int length;//表长
}SqList;
SqList* CreateList(SqList *L,int n);    //创建顺序表
SqList* InitList(SqList *L);    //初始化顺序表
void InsertList(SqList *L, int index, elem e);    //在index处插入
void ListDelete(SqList *L, int index);    //删除index处元素
int LocteElem(SqList *L, elem e);    //查找数据e在顺序表里的位置
void GetElem(SqList* L, int index);   //输出index处的值
 
 

SqList* CreateList(SqList* L, int n) {
        L->data = (elem*)malloc(MAXSIZE * sizeof(elem));
        for (int i = 0; i < n; i++) {
            printf("请按先后输入指数和系数:\n");
            scanf("%d %lf",&L->data[i].expn,&L->data[i].coef);
        }
        L->length = n;
        return L;
}
SqList* InitList(SqList* L) {
    L->data = (elem*)malloc(MAXSIZE * sizeof(elem));
    L->length = 0;
    return L;
}
void InsertList(SqList* L, int index, elem e) {
    if (index > (L->length + 1) || index < 1||L->length==MAXSIZE) {
        printf("ERROR\n");
    }
    else {
        for (int i = L->length - 1; i > index - 1; i--) {
            L->data[i + 1] = L->data[i];
        }
        L->data[index - 1] = e;
        L->length++;
    }
}
void ListDelete(SqList* L, int index) {
    if (index > L->length || index < 1) {
        printf("ERROR\n");
    }
    else {
        for (int i = index-1; i < L->length - 1; i++) {
            L->data[i] = L->data[i + 1];
        }
        L->length--;
    }
}
int LocteElem(SqList* L, elem e) {
    int isPrime = 0,i=0;
    for (i = 0; i < L->length - 1; i++) {
        if (e.expn == L->data[i].expn&&e.coef==L->data[i].coef) {
            printf("该元素位于第%d位\n", i + 1);
            isPrime = 1;
            break;
        }
    }
    if (!isPrime) {
        printf("表中无元素\n");
        return -1;
    }
    return i+1;
}
void GetElem(SqList* L, int index) {
    if (index<1 || index>L->length) {
        printf("ERROR\n");
    }
    else {
        printf("指数为%d  系数为%lf\n", L->data[index - 1].expn, L->data[index - 1].coef);
    }
}

 
 int main()
{
    SqList* k = NULL;
    k = CreateList(k, 5);
    return 0;
}

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632