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