单链表的创建和一些基本操作

我的代码实现了前插法创建单链表和单链表的取值、查找、插入、删除和显示。但在删除节点后再显示会出现错误,希望能有人帮我解决一下。

#include <stdio.h>
#include <stdlib.h>

typedef struct LNode {
    float date;
    struct LNode *next;
} LNode, *LinkList;

//前插法创建单链表
void CreateList(LinkList &L, int n) {
    LNode *p;
    L = new LNode;
    L->next = NULL;
    printf("请输入%d个元素\n", n);
    for (int i = 0; i < n; i++) {
        p = new LNode;
        scanf("%f", &p->date);
        p->next = L->next;
        L->next = p;
    }
}

//取值
void GetElem(LinkList L, int i, float &e) {
    int j;
    LNode *p;
    p = L->next;
    j = 1;
    while (p && j < i) {
        p = p->next;
        j++;
    }
    if (!p || j > i)
        printf("取值失败\n");
    e = p->date;
    printf("%.1f\n", e);
}

//查找
void LocateElem(LinkList L, float e) {
    LNode *p;
    p = L->next;
    while (p && p->date != e)
        p = p->next;
    if (p != NULL)
        printf("所找元素存在\n");
    else
        printf("所找元素不存在\n");
}

//插入
void ListInsert(LinkList &L, int i, float e) {
    LNode *p, *s;
    int j;
    p = L;
    j = 0;
    while (p && (j < i - 1)) {
        p = p->next;
        j++;
    }
    if (!p || j > i - 1)
        printf("插入失败\n");
    s = new LNode;
    s->date = e;
    s->next = p->next;
    p->next = s;
    printf("插入成功\n");
}

//删除
void ListDelete(LinkList &L, int i) {
    LNode *p, *q;
    int j;
    p = L;
    j = 0;
    while (p && j < i - 1) {
        p = p->next;
        j++;
    }
    if (!(p->next) || (j > i - 1))
        printf("删除失败\n");
    q = p->next;
    delete q;
    printf("删除成功\n");
}

//显示
void show(LinkList &L, int n) {
    LNode *p;
    p = L->next;
    int i = 1;
    while (p && i <= n) {
        printf("%5.1f", p->date);
        p = p->next;
    }
    printf("\n");
}

//菜单
void menu() {
    printf("-----功能及编号菜单-----\n");
    printf("0:退出程序\n");
    printf("1:创建单链表\n");
    printf("2:取值\n");
    printf("3:查找\n");
    printf("4:插入\n");
    printf("5:删除\n");
    printf("6:显示\n");
}

int main() {
    LinkList L;
    float e;
    int n, i, j, k;
    LNode *p, *q;
    menu();
    printf("请输入所需功能编号:");
    scanf("%d", &k);
    while (k != 0) {
        switch (k) {
            case 0:
                return 0;
            case 1:
                printf("请输入链表结点个数:");
                scanf("%d", &n);
                CreateList(L, n);
                break;
            case 2:
                printf("请输入所取值序号:");
                scanf("%d", &i);
                GetElem(L, i, e);
                break;
            case 3:
                printf("请输入所查找数据:");
                scanf("%f", &e);
                LocateElem(L, e);
                break;
            case 4:
                printf("输入插入节点序号:");
                scanf("%d", &i);
                printf("输入插入数据:");
                scanf("%f", &e);
                ListInsert(L, i, e);
                break;
            case 5:
                printf("请输入所删除节点的序号:");
                scanf("%d", &i);
                ListDelete(L, i);
                break;
            case 6:
                printf("请输入所显示节点个数:");
                scanf("%d", &j);
                show(L, j);
        }
        printf("请输入所需功能编号:");
        scanf("%d", &k);
    }
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值