qq_45787387 2020-02-19 18:59 采纳率: 0%
浏览 515
已采纳

求大神看看我真的不知道哪里错了

#include <string.h>

//输入
typedef struct DataType
{
    char name[10];
    char num[12];
}Datatype;

Datatype InputInfo()
{
    Datatype x;
    printf("请输入姓名和电话号码:\n");
    scanf("%s%s",&x.name,&x.num);
    return x;
}
//输出
void PrintInfo(Datatype x)
{
    printf("姓名:%s,电话号码:%s\n",x.name,x.num);
}
//比较姓名函数
int CompareName(Datatype a, Datatype b)
{
    if (strcmp(a.name, b.name) == 0)
        return 1;
    else
        return 0;
}

typedef struct Node
{
    Datatype data;
    struct Node* next;
}Node, *LinkList;
//创建带头节点的链表
void InitList(LinkList *head)
{
    LinkList p = (LinkList)malloc(sizeof(Node));
    p->next = NULL;
    (*head) = p;
}
//查询链表长度
int LengthList(LinkList head)
{
    LinkList p = head;
    int length = 0;
    while (p->next != NULL)
    {
        length++;
        p = p->next;
    }
    return length;
}
//按内容查找元素位置,成功返回位置,失败返回0
int LocateElem(LinkList head, Datatype e, int(*fun)(Datatype, Datatype))
{
    int pos = 0;
    LinkList p = head->next;
    while (p != NULL)
    {
        if ((*fun)(p->data, e) == 1)
            return (pos + 1);
        p = p->next;
        pos++;
    }
    return 0;
}
//按位置返回元素,成返回1,失败返回0
int GetElem(LinkList head, int pos, Datatype *e)
{
    int length = LengthList(head);
    LinkList p = head;
    if (pos < 1 || pos > length)
        return 0;
    for (int i = 0; i < pos; i++)
    {
        p = p->next;
    }
    (*e) = p->data;
    return 1;
}
//按位置删除元素,成功返回1,失败返回0
int DeleteElem(LinkList head, int pos, Datatype *e)
{
    int length = LengthList(head);
    if (pos < 1 || pos > length)
        return 0;
    LinkList p = head;  
    LinkList q = NULL;
    for (int i = 0; i < pos - 1; i++)
    {
        p = p->next;
    }
    q = p->next;
    p->next = p->next->next;
    (*e) = q->data;
    free(q);
    return 1;
}
//按位置插入元素,成功返回1,失败返回0
int InsertElem(LinkList head, int pos, Datatype e)
{
    int length = LengthList(head);
    if (pos < 1 || pos > length + 1)
        return 0;
    LinkList p = head;
    LinkList pNew = (LinkList)malloc(sizeof(Datatype));
    pNew->data = e;
    for (int i = 0; i < pos - 1; i++)
    {
        p = p->next;
    }
    pNew->next = p->next;
    p->next = pNew;
    return 1;
}
//遍历链表
void TraverseList(LinkList head)
{
    int length = LengthList(head);
    LinkList p = head->next;
    for (int i = 0; i < length; i++)
    {
        PrintInfo(p->data);
        p = p->next;
    }
}
//销毁链表
void DestroyList(LinkList head)
{
    LinkList p = head;
    LinkList q = p;
    while (p != NULL)
    {
        p = p->next;
        free(q);
        q = p;
    }
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include "DataType.h"
#include "LinkList.h"
int main()
{
    int ch,pos,length;//用于输入操作数,返回位置,链表长度
    Datatype x;//用来输入元素
    LinkList L;
    InitList(&L);
    while (1)
    {   
        system("cls");
        printf("请输入要进行的操作\n");
        printf("1.添加链表元素\n");
        printf("2.插入链表元素\n");
        printf("3.删除链表元素\n");
        printf("4.修改链表元素\n");
        printf("5.打印链表元素\n");
        printf("6.销毁退出\n");
        scanf("%d",&ch);
        switch (ch)
        {
        case 1:
            x = InputInfo();
            length = LengthList(L);
            if (InsertElem(L, length + 1, x))
                printf("添加成功\n");
            else
                printf("添加失败\n");
            system("pause");
            break;
        case 2:
            x = InputInfo();
            printf("请输入你要插入的位置\n");
            scanf("%d",&pos);
            if (InsertElem(L, pos, x))
                printf("插入成功\n");
            else
                printf("插入失败\n");
            system("pause");
            break;
        case 3:
            printf("请输入你要删除的名字\n");
            scanf("%s",&x.name);
            pos = LocateElem(L, x, CompareName);
            if (DeleteElem(L, pos, &x))
            {
                printf("删除成功\n");
                PrintInfo(x);
            }
            else
                printf("删除失败\n");
            system("pause");
            break;
        case 4:
            printf("请输入被修改的名字:\n");
            scanf("%s",&x.name);
            pos = LocateElem(L, x, CompareName);
            if (DeleteElem(L, pos, &x))
            {
                printf("信息修改为\n");
                x = InputInfo();
                InsertElem(L, pos, x);
                printf("修改成功\n");
            }
            else
                printf("修改失败\n");
            system("pause");
            break;
        case 5:
            TraverseList(L);
            system("pause");
            break;
        case 6:
            DestroyList(L);
            return;
        }
    }

    system("pause");
    return 0;
}

图片说明

求大神看看为什么我的删除函数会报错啊

  • 写回答

1条回答 默认 最新

  • threenewbee 2020-02-19 20:22
    关注

    LinkList pNew = (LinkList)malloc(sizeof(Datatype));
    ->
    LinkList pNew = (LinkList)malloc(sizeof(Node));

    问题解决请及时采纳

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥60 请查询全国几个煤炭大省近十年的煤炭铁路及公路的货物周转量
  • ¥15 请帮我看看我这道c语言题到底漏了哪种情况吧!
  • ¥66 如何制作支付宝扫码跳转到发红包界面
  • ¥15 pnpm 下载element-plus
  • ¥15 解决编写PyDracula时遇到的问题
  • ¥15 有没有人能解决下这个问题吗,本人不会编程
  • ¥15 plotBAPC画图出错
  • ¥30 关于#opencv#的问题:使用大疆无人机拍摄水稻田间图像,拼接成tif图片,用什么方法可以识别并框选出水稻作物行
  • ¥15 Python卡尔曼滤波融合
  • ¥20 iOS绕地区网络检测