| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 708 人关注过本帖
标题:是否可以用链式结构写学生成绩管理系统
只看楼主 加入收藏
野百合
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2014-4-14
收藏
 问题点数:0 回复次数:2 
是否可以用链式结构写学生成绩管理系统
#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;// 建立带头结点/尾指针的单链表
cout<<"要输入的学生总人数n:"; cin>>n; cout<<endl;
cout<<"学号:     姓名:      性别:     成绩:      "<<endl;
for (int i = 0; i <n; ++i) {
    p = new LNode;
    cin>>p->data[i].id>>p->data[i].name>>p->data[i].sex>>p->data[i].gread;// 输入元素值
    p->next = S->next; S->next = p;S=p;// 插入
}
} // 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 )
    return ERROR;       //  第 i 个元素不存在
else
{
e.id=p->data[i].id;//  取得第 i 个元素

strcpy(e.name,p->data[i].name);                                
strcpy(e.sex,p->data[i].sex);        
e.gread=p->data[i].gread;
return OK;
}        
} // GetElem_L
这些是我写的前面的一点点,但是到插入删除时,有问题了,就是比如当插入时,插入一个学生的信息后,那么在单链表中插入i位置以及其之后的data【i】以及其中的学号id要怎么去给它改变呢,请问这个能不能再继续了。。。。急需帮助
搜索更多相关主题的帖子: 管理系统 include 线性表 姓名 
2014-04-14 20:31
野百合
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2014-4-14
收藏
得分:0 
意思应该就是数组中能不能插入,,我问的是不是这个意思了。。求大神回复,,谢谢大家
2014-04-14 20:43
野百合
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2014-4-14
收藏
得分:0 
这个是我写的,,新手,,调试没错了,可是执行有问题,,很大的问题似乎,,希望大家懂得有时间给指教一下下


#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;
   }

}
2014-04-16 17:12
快速回复:是否可以用链式结构写学生成绩管理系统
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034254 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved