顺序链表问题,列表里面只有一个数据是怎么删不掉?
我在DEVc++上能运行了,有一个问题就是表里面还剩一个学生的时候删除不了,怎么办?我在VS2017上也冷运行,但是有一个问题就是插入学生,在输入学生姓名后就出错了,就不能运行了,怎么回事啊?
程序代码:
#include<stdio.h> #include<stdlib.h> #include<string.h> #define LEN 3 #define MAXSIZE 5 //定义datatype typedef struct { int sno; char sname[LEN]; int grade; } datatype; //比较datatype,返回0表示相等 int compare(datatype *x, datatype *y) { return x->sno - y->sno; } //打印datatype void printDatatype(datatype *x) { printf("%d\t%s\t%d\n", x->sno, x->sname, x->grade); } //定义顺序表 typedef struct { datatype data[MAXSIZE]; int last; }SeqList; /*******************线性表的基本操作**************************/ //初始化 SeqList *Init_SeqList() { SeqList *L; L = (SeqList *)malloc(sizeof(SeqList)); L->last = -1; return L; } //销毁 void Destroy_SeqList(SeqList **L) { if (*L) { free(*L); *L = NULL; } } //求表长 int Length_SeqList(SeqList *L) { return L->last; } //判断是否为空 int isEmpty_SeqList(SeqList *L) { return (L->last == 0); } //查找(按值) int Locate_SeqList(SeqList *L, datatype x) { int i = 0; while (i <= L->last && L->data[i].sno != x.sno) i++; if (i > L->last) return -1; else return i; } //插入 int Insert_SeqList(SeqList *L, int i, datatype x) { int j, k; if (L->last == MAXSIZE - 1) { printf("表满,空间已满!!!\n\n"); return 0; } if (i < 1 || i > L->last + 2) { printf("位置错!!\n\n"); return 0; } for (j = L->last; j >= i - 1; j--) L->data[j + 1] = L->data[j]; L->data[i - 1] = x; L->last++; return 1; } //删除 int Delete_SeqList(SeqList *L, int i) { int j; if (i < 1 || i > L->last + 1) { printf("无此学生"); return 0; } for (j = i; j <= L->last; j++) L->data[j - 1] = L->data[j]; L->last--; return 1; } /*******************程序的功能函数**************************/ //打印 void Print(SeqList *L) { printf("学生信息:(学号/t姓名/t成绩)\n"); for (int i = 0; i <= L->last; i++) printDatatype(&L->data[i]); printf("\n"); } //查找 void Search(SeqList *L) { int id, p; printf("请输入要查找的学生的学号:"); scanf("%d", &id); datatype std; std.sno = id; p = Locate_SeqList(L, std); if (p == -1) printf("没有此学生!\n"); else { printf("学生信息如下:\n"); printDatatype(&L->data[p]); } printf("\n"); } //插入 void Insert(SeqList *L) { int id, k, position, grade; char name[LEN]; if (L->last == MAXSIZE - 1) printf("表满,空间已满!!!\n\n"); else { printf("请输入你要插入的学号:"); scanf("%d", &id); for (k = 0; k <= L->last; k++) { if (L->data[k].sno == id) { printf("学号有重复的!!\n\n"); goto p; } } printf("请输入你要插入的姓名:"); scanf("%s", &name); printf("请输入你要插入的成绩:"); scanf("%d", &grade); datatype *std = (datatype *)malloc(sizeof(datatype)); std->sno = id; strcpy(std->sname, name); std->grade = grade; printf("请输入插入的位置:"); scanf("%d", &position); int a = Insert_SeqList(L, position, *std); if (a == 1) printf("插入成功!\n\n"); } p:; } //删除 void Delete(SeqList *L) { int id, i, k; printf("请输入要删除的学生的学号:"); scanf("%d", &id); datatype std; std.sno = id; int y = Locate_SeqList(L, std); if (y == -1) printf("无此学生!\n\n"); else { for (i = 0; i < L->last; i++) if (id == L->data[i].sno) break; k = Delete_SeqList(L, id); } if (k == 0) printf("删除失败!\n\n"); if (k == 1) printf("删除成功!\n\n"); } //更新 void Update(SeqList *L) { int i, id, grade; printf("请输入要更新的学生学号:"); scanf("%d", &id); if (id < 1 || id > L->last + 1) { printf("无此学生!!!\n\n"); goto x; } for (i = 0; i <= L->last; i++) { if (id == L->data[i].sno) { printf("请输入要更新的成绩:"); scanf("%d", &grade); L->data[i].grade = grade; printf("更新成功!\n\n"); break; } } x:; } /*******************main函数**************************/ void printChoice() { printf("please select a number:\n"); printf("*****1:打印成绩单\n"); printf("*****2:插入成绩\n"); printf("*****3:按学号查找成绩\n"); printf("*****4:修改成绩\n"); printf("*****5:按学号删除成绩\n"); printf("*****0:退出系统\n"); printf("请选择:"); } int main() { SeqList *L = Init_SeqList(); if (!L) { printf("分配内存失败!"); return 0; system("pause"); } int number; while (1) { printChoice(); scanf("%d", &number); switch (number) { case 1: Print(L); break; case 2: Insert(L); break; case 3: Search(L); break; case 4: Update(L); break; case 5: Delete(L); break; case 0: Destroy_SeqList(&L); return 0; system("pause"); default: printf("输入错误!!!\n"); } } }
[此贴子已经被作者于2018-3-18 19:03编辑过]