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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Wofficre/article/details/78335607

本次博客记录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 100
typedef 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。
最开始的时候没有注意,调试了很长时间,所以整型函数一定要有返回值。


猜你喜欢

转载自blog.csdn.net/Wofficre/article/details/78335607