zoukankan      html  css  js  c++  java
  • 线性表的基本操作

    一、实验目的:

    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("导入学生的个数过多
    ");
    		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("导入成功
    ");
    }
    
    //逐个显示学生表中所有学生的相关信息 
    void output(SqList &L){
    	if(!L.length) {
    		printf("学生表为空
    ");
    		return;
    	}
    	for(int i=0;i<L.length;i++){
    		printf("学号:%s		姓名:%s		成绩:%d
    ",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		成绩:%d
    ",L.elem[i].no,L.elem[i].price);
    			return;
    		}
    	}
    	printf("查找不到此同学
    ");
    }
    
    //根据指定的位置可返回相应的学生信息(学号,姓名,成绩)
    void print(SqList &L){
    	int id;
    	printf("输入要查找的位置:");
    	scanf("%d",&id);
    	if(id>=L.length){
    		printf("此位置不存在
    ");
    		return;
    	}
    	printf("学号:%s		姓名:%s		成绩:%d
    ",L.elem[id].no,L.elem[id].name,L.elem[id].price);
    }
    
    //给定一个学生信息,插入到表中指定的位置
    void ListInsert(SqList &L){
    	if(L.length==MAXSIZE){
    		printf("学生表已满
    ");
    		return;
    	}
    	int i;
    	printf("输入要插入的位置:");
    	scanf("%d",&i);
    	if(i>=L.length+1){
    		printf("此位置不存在
    ");
    		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("插入成功
    ");
    }
    
    //删除指定位置的学生记录
    void ListDelete(SqList &L){
    	if(!L.length){
    		printf("学生表为空
    ");
    		return;
    	}
    	int i;
    	printf("输入要删除的位置:");
    	scanf("%d",&i);
    	if(i>=L.length){
    		printf("此位置不存在
    ");
    		return;
    	}
    	if(i<L.length){ //不在末尾 
    		for(int k=i;k<L.length-1;k++){
    			L.elem[k]=L.elem[k+1];
    		}
    	}
    	L.length--;
    	printf("删除成功
    ");
    }
    
    //统计表中学生个数
    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
    ",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("导入成功
    ");
    }
    
    //逐个显示学生表中所有学生的相关信息 
    void output(LinkList &L){
    	if(L->next==NULL) {
    		printf("学生表为空
    ");
    		return;
    	}
    	LinkList p = L->next;
    	while(p!=NULL){
    		printf("学号:%s		姓名:%s		成绩:%d
    ",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		成绩:%d
    ",p->data.no,p->data.price);
    			return;
    		}
    		p = p->next;
    	}
    	printf("查找不到此同学
    ");
    }
    
    //根据指定的位置可返回相应的学生信息(学号,姓名,成绩)
    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("此位置不存在
    ");
    		return;
    	}
    	printf("学号:%s		姓名:%s		成绩:%d
    ",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("此位置不存在
    ");
    		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("插入成功
    ");
    }
    
    //删除指定位置的学生记录
    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("此位置不存在
    ");
    		return;
    	}
    	LinkList q = p->next;
    	p->next = q->next;
    	free(q);
    	printf("删除成功
    ");
    }
    
    //统计表中学生个数
    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
    ",ListLength(L));
        	else puts("请输入正确的数"); 
    	}
    	return 0; 
    }
    
  • 相关阅读:
    老齐python-基础7(文件操作、迭代)
    老齐python-基础6(循环 if while for)
    老齐python-基础5(运算符、语句)
    老齐python-基础4(元祖、字典、集合)
    老齐python-基础3(列表)
    老齐python-基础2(字符串)
    Jupyter notebook 的安装、入门
    pycharm 激活码
    VMware无法连接 MKS:套接字连接尝试次数太多正在放弃
    Numpy基本用法简介
  • 原文地址:https://www.cnblogs.com/transmigration-zhou/p/13950240.html
Copyright © 2011-2022 走看看