C语言数据结构实现顺序表增删改差(数据结构第一次实验)

来源:互联网 发布:网络信息管理办公室 编辑:程序博客网 时间:2024/05/24 22:44

本次博客记录C语言第一次数据结构作业,部分参考了

1.严蔚敏版C数据结构

2.http://blog.csdn.net/wang907553141/article/details/52607380

但是大部分逻辑时自己实现,由于基础不好,所以逻辑比较混乱

Lab1 线性表的基本操作及其应用

课程名:数据结构

实验目的:

1、掌握线性表的定义;

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

实验要求:定义一个包含学生信息(学号,姓名,成绩)的顺序表和链表,使其具有如下功能:

(1) 根据指定学生个数,逐个输入学生信息;

(2) 逐个显示学生表中所有学生的相关信息;

(3) 根据姓名进行查找,返回此学生的学号和成绩;

(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);

(5) 给定一个学生信息,插入到表中指定的位置;

(6) 删除指定位置的学生记录;

(7) 统计表中学生个数。

实验题目:线性表的基本操作及其作用

实验过程:

按照实验要求编写相应程序代码,并调试运行。

附:顺序表与链表操作的主函数代码。

运行演示过程如下(这部分不需要写到报告上):

1、 创建一个学生表(5个学生);

2、 显示该表中所有的元素;

3、 根据姓名查找到第3个学生的信息并显示;

4、 插入一个新的学生并显示全部学生信息;

5、 删除第3个学生的信息并显示全部学生信息;

6、 统计学生表中元素的个数(即学生人数);

7、 退出

#include<stdio.h>#include<stdlib.h>  #include<string.h>  #define OK 1  #define ERROR 0  #define MAXSIZE 100typedef int Status; typedef struct{int id;char name[20];int score;}Student;typedef Student ElemType; typedef struct{ElemType *elem;int length; }SqList;//创建顺序表操作// Status Creat(SqList &L){L.elem=new ElemType[MAXSIZE];if(!L.elem) return ERROR;L.length=0;return OK; }//给顺序表添加基本学生信息操作// Status Insert(ElemType *e){printf("请输入学生的学号:");scanf("%d",&e->id);printf("请输入学生的姓名:");scanf("%s",&e->name);printf("请输入学生的成绩:");scanf("%d",&e->score);}//显示所有学生信息操作// Status Output(ElemType *p){printf("%d\t",p->id);printf("%s\t",p->name);printf("%d\n",p->score);}//根据学号查询操作// Status Search(ElemType *p,char f[20]){if(strcmp(p->name,f)==0){printf("该生的学号是:%d\n",p->id);printf("该生的学号是:%s\n",p->name);printf("该生的学号是:%d\n",p->score);return OK;}}//插入操作// Status Add(ElemType *p0,ElemType *p1,SqList &L,int i){if(p1->id<p0->id){//插入的学生不在末尾时 //for(int s=L.length;s>=i+1;s--){L.elem[s]=L.elem[s-1];             }L.elem[i]=*p1;L.length+=1;return OK;}else{//插入的学生在末尾时// if(i==L.length-1){printf("ssssssssssssssssssssssssssss\n");L.elem[i+1]=*p1;L.length+=1;return OK;}}return ERROR;}//删除操作// Status Delete(SqList &L,int d,ElemType *p,int i){if(p->id==d){if(i!=L.length-1){//删除的学生不再末尾时// for(i;i<=L.length-2;i++){    L.elem[i]=L.elem[i+1];}L.length=L.length-1;return OK;}else{//删除的学生在末尾时// L.length=L.length-1;return OK;}}}int main(){SqList L;int choose,r,p;printf("====================================\n");printf("欢迎使用学生成绩管理系统V1.00\n");printf("功能如下:\n");printf("输入1:创建空的顺序表\n");printf("输入2:添加学生的信息\n");printf("输入3:显示顺序表所有学生的信息\n");printf("输入4:根据姓名查找学生的信息\n");printf("输入5:插入一个新的学生\n"); printf("输入6:删除一个学生的信息\n");printf("输入7:统计表中的学生个数\n");printf("输入0:退出系统\n");printf("====================================\n");while(1){printf("请选择命令:");scanf("%d",&choose);if(choose==0){printf("非常感谢您使用本系统!");break;}switch(choose){case 1:r=Creat(L);if(r==1){printf("创建顺序表成功!\n");}else{printf("创建顺序表失败!\n");}break;case 2:int num;printf("请输入创建的学生数:");scanf("%d",&num); for(int i=0;i<=num-1;i++){Insert(&L.elem[i]);L.length+=1; }break;case 3:printf("id\t");printf("name\t");printf("score\n");for(int i=0;i<=L.length-1;i++){Output(&L.elem[i]);}break;case 4:int result_Search;char f4[20];printf("请输入要查找的学生的姓名:");scanf("%s",&f4);for(int i=0;i<=L.length-1;i++){result_Search=Search(&L.elem[i],f4);}if(result_Search==1){printf("查询成功!\n");}break;case 5:ElemType newstu;Insert(&newstu);int add;for(int i=0;i<=L.length-1;i++){add=Add(&L.elem[i],&newstu,L,i);if(add!=1){continue;}else{printf("插入成功!\n");break;}}break;case 6:int delstu;int del_result;printf("请输入要删除的学生的学号:");scanf("%d",&delstu);for(int i=0;i<=L.length-1;i++){del_result=Delete(L,delstu,&L.elem[i],i);if(del_result==1){printf("删除成功!\n");break;}}break;case 7:printf("当前表中共有%d个学生!\n",L.length);break;}}return 0;} 
本次实验中出现了一个折磨了我2个小时的Bug:
定一个整型变量add,如果add等于一个整型函数的返回值,且该函数没有return,每调用一次add的值就会从0开始加1,调用5次就加到5。
最开始的时候没有注意,调试了很长时间,所以整型函数一定要有返回值。


阅读全文
1 0