这个是我写的,,新手
,,调试没错了,可是执行有问题,,很大的问题似乎,,希望大家懂得有时间给指教一下下
#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
#include <iomanip.h>
#define ERROR 0
#define OK 1
#define OVERFLOW -2
struct student
{
int id;
// 学号
char name[30]; // 姓名
char sex[2];
// 性别
float gread; // 成绩
};
typedef struct student DataType; //
指定struct student为DataType
typedef struct LNode
{
DataType* data; // data[0], data[1], ..., data[n - 1]存放线性表中的元素
struct LNode* next;
}LNode,*LinkList;
void CreateList_L(LinkList &L, int n) {
// 正序输入 n 个数据元素,建立带头结点的单链表
LinkList p,S;//p与S是结点类型的指针
L = new LNode;
L->next = NULL; S=L;// 建立带头结点/尾指针的单链表
for (int i = 0; i <n; ++i) {
p = new LNode;
cout<<"学号: ";// 输入元素值
cin>>p->data[i].id;
cout<<"成绩:
";
cin>>p->data[i].gread;
cout<<"姓名: ";
cin>>p->data[i].name;
cout<<"性别: ";
cin>>p->data[i].sex;
p->next = S->next; S->next = p;S=p;// 插入
}
cout<<"总人数n="<<n<<endl;
} // CreateList_L
int GetElem_L(LinkList L, int i, DataType &e) {
// L是带头结点的链表的头指针,以 e 返回第 i 个元素
LinkList p;
p = L->next;
int j = 1;
// p指向第一个结点,j为计数器
while (p && j<i)
{ p = p->next;
++j;
}
// 顺指针向后查找,直到 p 指向第 i 个元素
// 或 p 为空
if ( !p || j>i )
{
cout<<"此学生不在"<<endl;
return ERROR;
//
第 i 个元素不存在
}
else
{
e.id=p->data[i-1].id;//
取得第 i 个元素
strcpy(e.name,p->data[i-1].name);
strcpy(e.sex,p->data[i-1].sex);
e.gread=p->data[i-1].gread;
cout<<"此学生信息为:";
cout<<"学号:"<<e.id;
cout<<"姓名:"<<e.name;
cout<<"性别:"<<e.sex;
cout<<"分数:"<<e.gread<<endl;
return OK;
}
} // GetElem_L
int ListInsert_L(LinkList &L, int i, DataType e) {
// L 为带头结点的单链表的头指针,
// 在链表中第i 个结点之前插入新的元素 e
LinkList p,s;
DataType* data;
p = L;
int j = 0,n;
while (p && j < i-1)
{ p = p->next;
++j; }
// 寻找第 i-1 个结点
if (!p || j > i-1)
{ cout<<"添加失败!"<<endl;
return ERROR;
}
// i 大于表长或者小于1
else
{
s = new LNode;
// 生成新结点
s->data[i-1].id = e.id;
strcpy(s->data[i-1].name , e.name);
strcpy(s->data[i-1].sex , e.sex);
s->data[i-1].gread = e.gread;
s->next = p->next;
p->next = s; // 插入
n=n+1;
for(int i;i<=n;++i)
data[i].id=i+1;
cout<<"添加成功!"<<endl;
cout<<"总人数为n="<<n<<endl;
return OK;
}
} // LinstInsert_L
int ListDelete_L(LinkList &L, int i, DataType &e) {
// 删除以 L 为头指针(带头结点)的单链表中第 i 个结点
LinkList p,q;
DataType* data;
p = L;
int
j = 0,n;
while (p->next && j < i-1) {
p = p->next;
++j; }
// 寻找第 i 个结点,并令 p 指向其前趋
if
(!(p->next) || j > i-1)
{cout<<"删除位置不合理!"<<endl;
return ERROR; } // 删除位置不合理
else{
q = p->next;
p->next = q->next;
// 删除并释放结点
e.id=q->data[i-1].id;//
取得第 i 个元素
strcpy(e.name,q->data[i-1].name);
strcpy(e.sex,q->data[i-1].sex);
e.gread=q->data[i-1].gread;
delete q;
n=n-1;
for(int i;i<=n;++i)
{data[i-1].id=i;}
cout<<"学号是"<<e.id<<"的学生的信息是:";
cout<<"姓名:"<<e.name;
cout<<"性别:"<<e.sex;
cout<<"分数:"<<e.gread<<endl;
return OK;
}
} // ListDelete_L
void updataElem_L(LinkList L, int i, DataType &E) {
// L是带头结点的链表的头指针,以 e 返回第 i 个元素,修改功能
LinkList p;
char name[30];
char sex[2];
float gread;
p = L->next;
int j = 1;
// p指向第一个结点,j为计数器
while (p && j<i)
{ p = p->next;
++j;
}
// 顺指针向后查找,直到 p 指向第 i 个元素
// 或 p 为空
if ( !p || j>i )
cout<<"没此学生!"<<endl;
//
第 i 个元素不存在
else
{
cout<<"请输入要修改的学生的信息:";
cout<<"姓名:";
cin>>name;
cout<<"性别:";
cin>>sex;
cout<<"分数:";
cin>>gread;
strcpy(p->data[i-1].name,E.name); //修改第i个元素
strcpy(p->data[i-1].sex,E.sex);
p->data[i-1].gread=E.gread;
cout<<"修改成功!";
}
} // GetElem_L
void Print(LinkList &L,int id)
{
int n;
for (int i = 0; i < n; ++i)
// 输出线性表的元素值
{
if (id == L->data[i].id)
{
cout<< "学号:" << L->data[i].id << ",姓名:" << L->data[i].name << ",性别:" << L->data[i].sex ;
cout<< "分数:" << L->data[i].gread<<endl;
break;
}
}
}
void print_L(LinkList &L,int id)// 根据学生id,输出链表的元素值
{
int n;
for (int i = 0; i < n; ++i)
// 输出链表的元素值
{
if (id == L->data[i].id)
{
cout<< "学号:" << L->data[i].id << ",姓名:" << L->data[i].name << ",性别:" << L->data[i].sex ;
cout<< "语文:" << L->data[i].gread;
cout<<endl;
break;
}
}
}
void main()
{
LinkList L;
L:
system("cls");
cout<<"************""学生成绩管理系统""************"<<endl;
cout<<endl;
cout<<"
1.创建学生信息
"<<endl;
cout<<"
2.查找学生信息
"<<endl;
cout<<"
3.添加学生信息
"<<endl;
cout<<"
4.删除学生信息
"<<endl;
cout<<"
5.修改学生信息
"<<endl;
cout<<"
6.退出学生系统
"<<endl;
int k,n;
cout<<"请选择一个操作(1-6):";
cin>>k;
if (k == 1)
{
L1:
cout<<"要输入的学生总人数n:"; cin>>n; cout<<endl;
cout<<"请输入学生的信息:"<<endl;
CreateList_L(L, n);
int iopselect;
cout<<"按0返回主菜单"<<endl;
cin>>iopselect;
if (iopselect == 0)
goto L ;
else
cout<<"请输入0!"<<endl;
}
else if (k == 2)
{
L2:
int
i;
DataType e;
cout<<"请输入要查找的学生学号:"<<endl;
cin>>i;
GetElem_L(L, i, e);
int iopselect;
cout<<endl<<"还要继续查询吗?(按0返回主菜单,否则继续此操作。)"<<endl;
cin>>iopselect;
if (iopselect == 0)
goto L ;
else
goto L2;
}
else if (k == 3)
{
L3:
int i;
DataType e;
cout<<endl<<"请添加学生信息:"<<endl;
cout<<"学号: ";
cin>>e.id;
cout<<"姓名:";
cin>>e.name;
cout<<"性别: ";
cin>>e.sex;
cout<<"成绩: ";
cin>>e.gread;
i=e.id;
ListInsert_L(L, i, e);
int iopselect;
cout<<endl<<"还要继续吗?(按0返回主菜单,否则继续此操作。)"<<endl;
cin>>iopselect;
if (iopselect == 0)
goto L ;
else
goto L3;
}
else if (k == 4)
{
L4:
cout<<"请输入要删除的学生学号:"<<endl;
int id,i;
DataType e;
cin>>id;
i=id;
ListDelete_L(L, i,e);
int iop;
cout<<endl<<"还要继续删除吗?(按0返回主菜单,否则继续此操作。)"<<endl;
cin>>iop;
if (iop == 0)
goto L ;
else
goto L4;
}
else if (k == 5)
{
L5:
cout<<"请输入要修改的学生学号:"<<endl;
int id,i;
DataType E;
cin>>id;
i=id;
updataElem_L(L, i,E);
int iselect;
cout<<endl<<"还要继续修改吗?(按0返回主菜单,否则继续此操作。)"<<endl;
cin>>iselect;
if (iselect == 0)
goto L ;
else
goto L5;
}
else if (k == 6)
{
system("cls");
cout<<"您已经退出本系统,欢迎下次再使用."<<endl;
}
}