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

    问题解决请及时采纳

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

报告相同问题?

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置