一、实验目的:

1、掌握线性表的定义;
2、掌握线性表的基本操作,如建立、查找、插入和删除等。

二、实验内容:

定义一个包含学生信息(学号,姓名,成绩)的的顺序表和链表,使其具有如下功能:
(1) 根据指定学生个数,逐个输入学生信息;
(2) 逐个显示学生表中所有学生的相关信息;
(3) 根据姓名进行查找,返回此学生的学号和成绩;
(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);
(5) 给定一个学生信息,插入到表中指定的位置;
(6) 删除指定位置的学生记录;
(7) 统计表中学生个数。

三、数据结构设计

图片说明

四、代码

  • SqList
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXSIZE 100

//学生信息的定义
typedef struct {
    char no[8];   //8位学号
    char name[20]; //姓名
    int price;     //成绩
}Student;

//顺序表的定义
typedef  struct {
    Student *elem;     //指向数据元素的基地址
    int length;       //线性表的当前长度                                                           
}SqList;

//开始界面 
void start(){
    puts("1. 根据指定学生个数,逐个输入学生信息 ");  
    puts("2. 逐个显示学生表中所有学生的相关信息");  
    puts("3. 根据姓名进行查找,返回此学生的学号和成绩");  
    puts("4. 根据指定的位置可返回相应的学生信息(学号,姓名,成绩)");   
    puts("5. 给定一个学生信息,插入到表中指定的位置");  
    puts("6. 删除指定位置的学生记录");  
    puts("7. 统计表中学生个数");  
    puts("0. 退出");
}

//初始化
void InitList(SqList &L){
    L.elem=(Student*)malloc(MAXSIZE*sizeof(Student));
    L.length=0;
}

//判断学号是否相同 
bool check_same(SqList &L,char* _no){
    for(int i=0;i<L.length;i++){
        if(!strcmp(L.elem[i].no,_no)) return false;
    }
    return true;
}

//判断成绩是否符合要求
bool check_mark(int price){
    if(price<0) return false;
    if(price>100) return false;
    return true; 
} 

//根据指定学生个数,逐个输入学生信息 
void input(SqList &L){
    int n;
    printf("输入要导入学生的个数:");
    scanf("%d",&n);
    if(n+L.length>MAXSIZE){
        printf("导入学生的个数过多\n");
        return;
    }
    for(int i=0;i<n;i++){
        printf("输入学生的学号:");
        scanf("%s",L.elem[L.length].no);
        printf("输入学生的姓名:");
        scanf("%s",L.elem[L.length].name);
        printf("输入学生的成绩:");
        scanf("%d",&L.elem[L.length].price);
        L.length++;

    }
    printf("导入成功\n");
}

//逐个显示学生表中所有学生的相关信息 
void output(SqList &L){
    if(!L.length) {
        printf("学生表为空\n");
        return;
    }
    for(int i=0;i<L.length;i++){
        printf("学号:%s\t\t姓名:%s\t\t成绩:%d\n",L.elem[i].no,L.elem[i].name,L.elem[i].price);
    }
} 

//根据姓名进行查找,返回此学生的学号和成绩
void search(SqList &L){
    char find_name[20];
    printf("输入该同学的姓名:");
    scanf("%s",find_name);
    for(int i=0;i<L.length;i++){
        if(!strcmp(find_name,L.elem[i].name)){
            printf("学号:%s\t\t成绩:%d\n",L.elem[i].no,L.elem[i].price);
            return;
        }
    }
    printf("查找不到此同学\n");
}

//根据指定的位置可返回相应的学生信息(学号,姓名,成绩)
void print(SqList &L){
    int id;
    printf("输入要查找的位置:");
    scanf("%d",&id);
    if(id>=L.length){
        printf("此位置不存在\n");
        return;
    }
    printf("学号:%s\t\t姓名:%s\t\t成绩:%d\n",L.elem[id].no,L.elem[id].name,L.elem[id].price);
}

//给定一个学生信息,插入到表中指定的位置
void ListInsert(SqList &L){
    if(L.length==MAXSIZE){
        printf("学生表已满\n");
        return;
    }
    int i;
    printf("输入要插入的位置:");
    scanf("%d",&i);
    if(i>=L.length+1){
        printf("此位置不存在\n");
        return;
    }
    char _no[8];   //8位学号
    char _name[20]; //姓名
    int _price;     //成绩
    printf("输入要插入学生的学号:");
    scanf("%s",_no);
    if(!check_same(L,_no)){
        puts("该学号已被使用");
        return;
    }
    printf("输入要插入学生的姓名:");
    scanf("%s",_name);
    printf("输入要插入学生的成绩:");
    scanf("%d",&_price);
    if(!check_mark(_price)){
        puts("成绩不符合要求");
        return;
    }
    if(i<L.length){ //不在末尾
        for(int k=L.length-1;k>=i;k--){
            L.elem[k+1]=L.elem[k];
        }
    }
    strcpy(L.elem[i].no,_no);
    strcpy(L.elem[i].name,_name);
    L.elem[i].price=_price;
    L.length++;
    printf("插入成功\n");
}

//删除指定位置的学生记录
void ListDelete(SqList &L){
    if(!L.length){
        printf("学生表为空\n");
        return;
    }
    int i;
    printf("输入要删除的位置:");
    scanf("%d",&i);
    if(i>=L.length){
        printf("此位置不存在\n");
        return;
    }
    if(i<L.length){ //不在末尾 
        for(int k=i;k<L.length-1;k++){
            L.elem[k]=L.elem[k+1];
        }
    }
    L.length--;
    printf("删除成功\n");
}

//统计表中学生个数
int ListLength(SqList &L){
    return L.length;
}

int main(){
#ifdef DEBUG
//    freopen("F:/laji/1.in", "r", stdin);
//    freopen("F:/laji/2.out", "w", stdout);
#endif
    start();
    SqList L;
    InitList(L);
    int op;
    while(scanf("%d",&op),op){
        if(op==1) input(L);
        else if(op==2) output(L);
        else if(op==3) search(L);
        else if(op==4) print(L);
        else if(op==5) ListInsert(L);
        else if(op==6) ListDelete(L);
        else if(op==7) printf("学生个数:%d\n",ListLength(L));
        else puts("请输入正确的数"); 
    }
    return 0; 
}
  • LinkList
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//学生信息的定义
typedef struct {
    char no[8];   //8位学号
    char name[20]; //姓名
    int price;     //成绩
}Student;

//链表的定义:
typedef struct LNode{
    Student data;       //数据域
    struct LNode *next;   //指针域
}LNode,*LinkList;   

//开始界面 
void start(){
    puts("1. 根据指定学生个数,逐个输入学生信息 ");  
    puts("2. 逐个显示学生表中所有学生的相关信息");  
    puts("3. 根据姓名进行查找,返回此学生的学号和成绩");  
    puts("4. 根据指定的位置可返回相应的学生信息(学号,姓名,成绩)");   
    puts("5. 给定一个学生信息,插入到表中指定的位置");  
    puts("6. 删除指定位置的学生记录");  
    puts("7. 统计表中学生个数");  
    puts("0. 退出");
}

//初始化 
void InitList(LinkList &L){
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
}

//判断学号是否相同 
bool check_same(LinkList &L,char* _no){
    LinkList p = L->next;
    while(p!=NULL){
        if(!strcmp(p->data.no, _no)) return false;
        p = p->next;
    }
    return true;
}

//判断成绩是否符合要求
bool check_mark(int price){
    if(price<0) return false;
    if(price>100) return false;
    return true; 
} 

//根据指定学生个数,逐个输入学生信息 
void input(LinkList &L){
    int n;
    printf("输入要导入学生的个数:");
    scanf("%d",&n);
    LinkList p = L;
    while(p->next!=NULL){
        p=p->next;
    }
    for(int i=0;i<n;i++){
        LinkList q = (LinkList)malloc(sizeof(LNode));
        printf("输入学生的学号:");
        scanf("%s",q->data.no);
        printf("输入学生的姓名:");
        scanf("%s",q->data.name);
        printf("输入学生的成绩:");
        scanf("%d",&q->data.price);
        q->next = p->next;
        p->next = q;
    }
    printf("导入成功\n");
}

//逐个显示学生表中所有学生的相关信息 
void output(LinkList &L){
    if(L->next==NULL) {
        printf("学生表为空\n");
        return;
    }
    LinkList p = L->next;
    while(p!=NULL){
        printf("学号:%s\t\t姓名:%s\t\t成绩:%d\n",p->data.no,p->data.name,p->data.price);
        p = p->next;
    }
}

//根据姓名进行查找,返回此学生的学号和成绩
void search(LinkList &L){
    char find_name[20];
    printf("输入该同学的姓名:");
    scanf("%s",find_name);
    LinkList p = L;
    while(p!=NULL){
        if(!strcmp(find_name,p->data.name)){
            printf("学号:%s\t\t成绩:%d\n",p->data.no,p->data.price);
            return;
        }
        p = p->next;
    }
    printf("查找不到此同学\n");
}

//根据指定的位置可返回相应的学生信息(学号,姓名,成绩)
void print(LinkList &L){
    int id,j=0;
    LinkList p = L->next;
    printf("输入要查找的位置:");
    scanf("%d",&id);
    while(p!=NULL&&j<id){
        p = p->next;
        j++;
    }
    if(p==NULL||j>id){
        printf("此位置不存在\n");
        return;
    }
    printf("学号:%s\t\t姓名:%s\t\t成绩:%d\n",p->data.no,p->data.name,p->data.price);
}

//给定一个学生信息,插入到表中指定的位置
void ListInsert(LinkList &L){
    int i,j=0;
    LinkList p = L;
    printf("输入要插入的位置:");
    scanf("%d",&i);
    while(p!=NULL&&j<i){
        p = p->next;
        j++;
    }
    if(p==NULL||j>i){
        printf("此位置不存在\n");
        return;
    }
    char _no[8];   //8位学号
    char _name[20]; //姓名
    int _price;     //成绩
    printf("输入要插入学生的学号:");
    scanf("%s",_no);
    if(!check_same(L,_no)){
        puts("该学号已被使用");
        return;
    }
    printf("输入要插入学生的姓名:");
    scanf("%s",_name);
    printf("输入要插入学生的成绩:");
    scanf("%d",&_price);
    if(!check_mark(_price)){
        puts("成绩不符合要求");
        return;
    }
    LinkList s=(LinkList)malloc(sizeof(LNode));
    strcpy(s->data.no,_no);
    strcpy(s->data.name,_name);
    s->data.price=_price;
    s->next = p->next;
    p->next = s;
    printf("插入成功\n");
}

//删除指定位置的学生记录
void ListDelete(LinkList &L){
    int i,j=0;
    LinkList p = L;
    printf("输入要删除的位置:");
    scanf("%d",&i);
    while(p->next!=NULL&&j<i){
        p = p->next;
        j++;
    }
    if(p->next==NULL||j>i){
        printf("此位置不存在\n");
        return;
    }
    LinkList q = p->next;
    p->next = q->next;
    free(q);
    printf("删除成功\n");
}

//统计表中学生个数
int ListLength(LinkList &L){
    int ans=0;
    LinkList p = L->next;
    while(p!=NULL){
        p=p->next;
        ans++;
    }
    return ans;
}

int main(){
#ifdef DEBUG
//    freopen("F:/laji/1.in", "r", stdin);
//    freopen("F:/laji/2.out", "w", stdout);
#endif
    start(); 
    LinkList L;
    InitList(L);
    int op;
    while(scanf("%d",&op),op){
        if(op==1) input(L);
        else if(op==2) output(L);
        else if(op==3) search(L);
        else if(op==4) print(L);
        else if(op==5) ListInsert(L);
        else if(op==6) ListDelete(L);
        else if(op==7) printf("学生个数:%d\n",ListLength(L));
        else puts("请输入正确的数"); 
    }
    return 0; 
}