线性表的基本操作

一、实验目的:

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

注意!此信息未认证,请谨慎判断信息的真实性!

全部评论
空

相关内容推荐

头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
3 1 评论
分享

全站热榜

正在热议