顺序链表问题,列表里面只有一个数据是怎么删不掉?
我在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编辑过]



