数据结构------使用单向链表实现简单的学生成绩管理操作

                                                  函数声明 

ypedef  int status;
typedef  int ElemType; 
//链表节点及链表数据表示定义
typedef struct Node
{
 double math;//数学
 double English;//英语
 double Chinese;//语文
}StudentData;
typedef struct SingleLinkNode{
	StudentData data;
	struct SingleLinkNode *next;
}SingleLinkNode,*SingleLinkList;
//以下是单向链表操作函数原型

//初始化操作
status InitSingleLinkList(SingleLinkList &l);
//链表销毁操作
void DestroySingleLinkList(SingleLinkList &l);
//链表清除操作
void ClearSingleLinkList(SingleLinkList &l);
//链表长度
int SingleLinkListLength(SingleLinkList l);

//链表是否为空
bool SingleLinkListEmpty(SingleLinkList l);

//取链表中的第i个元素
status GetSingleLinkListElem(SingleLinkList l,int i,StudentData &e);

//在链表的第i个位置插入元素
status InsertSingleLinkList(SingleLinkList &l,int i,StudentData e);
//删除链表的第i个元素
status DeleteSingleLinkList(SingleLinkList &l,int i);

//打印链表
void PrintSingleLinkList(SingleLinkList l);
//转置当前的链表
SingleLinkList reverse(SingleLinkList l);

               函数实现

//必须包含此文件,因为它包含此文件中要用到的数据表示定义
//以下实现的是带头节点的单向链表
#include"SingleLinkList.h"
#include"stdlib.h"
#include"iostream.h"
#include<iostream.h>
#include<cstdio>
//初始化操作
status InitSingleLinkList(SingleLinkList &l){

//	if(l)free(l);

	if(l=(SingleLinkList)malloc(sizeof(SingleLinkNode)))//如果分配成功,设置节点
		{l->next=NULL;
		return 1;}
	else
		return 0;//表示失败



}
//链表销毁操作
void DestroySingleLinkList(SingleLinkList &l)
{	
	SingleLinkList p=l,q;
	while(p)
	{
		q=p->next ;
		p=p->next;  
		free(q);
	}
	

}
//链表清除操作
void ClearSingleLinkList(SingleLinkList &l)
{
	SingleLinkList p=l->next ,q;
	while(p)
	{
		q=p->next ;
		free(p);
		p=q;
	}
	l->next =NULL;


}
//链表长度
int SingleLinkListLength(SingleLinkList l)
{
SingleLinkList p=l->next ;
int i=0;
if(l==NULL)
	return 0;
while(p)
	i++,p=p->next; 
return i;


}

//链表是否为空
bool SingleLinkListEmpty(SingleLinkList l)
{

return (l->next==NULL);

}

//取链表中的第i个元素
status GetSingleLinkListElem(SingleLinkList l,int i,StudentData &e)
{

	int k=0;
	SingleLinkList p=l->next;
	if(i<1||i>SingleLinkListLength(l)) 
		return 0;
	//1,寻找第i个节点

	while(p&&k<i-1)
		k++,p=p->next; 

	e =p->data ;
	return 1;



}

//在链表的第1个位置插入元素
status InsertSingleLinkList(SingleLinkList &l,int i,StudentData e)
{     i=1;
	int k=0;
	SingleLinkList p,q ;
	if(SingleLinkListLength(l)==0)InitSingleLinkList(l);
	p=l ;
	if(i<1||i>SingleLinkListLength(l)+1) 
		return 0;
	//1,寻找第i-1个节点

	while(p->next &&k<i-1)
		k++,p=p->next; 
	//2,构造节点
	if(!(q=(SingleLinkList)malloc(sizeof(SingleLinkNode))))
		return 0;
	//3,设置节点并将节点链入
	q->data =e;
	q->next =p->next ;
	p->next =q;
	return 1;
	
}
//删除链表的第i个元素
status DeleteSingleLinkList(SingleLinkList &l,int i)
{

	int k=0;
	SingleLinkList p=l->next;
	if(i<1||i>SingleLinkListLength(l)) 
		return 0;
	//1,寻找第i-1个节点
	while(p&&k<i-1)
	{k++;
	  p=p->next; 
	}
	SingleLinkList q=p->next;
	p->next=p->next->next ;

	free(q);
	return 1;
}
//打印链表
void PrintSingleLinkList(SingleLinkList l)
{
	SingleLinkList p=l->next ;
	int i=1;
	while(p)
	{   cout<<"第"<<i<<"个数据为"<<endl;
		cout<<"数学成绩"<<p->data.math<<" "<<"英语成绩"<<p->data.English<<" "<<"语文成绩"<<"  "<<p->data.Chinese<<" " ;
		cout<<endl;
		if(i%5==0)
			cout<<endl;
		p=p->next,i++ ;
	}
}
SingleLinkList reverse(SingleLinkList head)
{
  SingleLinkList p,q,pr;
  p = head->next;
  q = NULL;
  head->next = NULL;
  while(p){
    pr = p->next;
    p->next = q;
    q = p;
    p = pr;
  }
  head->next = q;
  return head;
}

                                 函数调用

#include"SingleLinkList.h"
#include<iostream.h>
#include<stdlib.h>
#include<cstdio>
#include<windows.h>
//改变输出位置的函数
void gotoxy(int y,int x){  
    COORD pos;  
    pos.X=x;  
    pos.Y=y;  
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos); 
}  

void main(void)
{  
	  bool jixu=true,jixu2=true,jixu3=true,jixu4=true;
	 SetConsoleTitle("张扬测试窗口");
	SingleLinkList l;  
	system("color 0A");
		//链表的初始化
			InitSingleLinkList(l);
a: 			     gotoxy(5,10);
           printf("********************各功能的操作代码********************\n");
			  gotoxy(6,30);
			  printf("1  插入学生各科数据\n",50);
			   gotoxy(7,30);
			  printf("2  删除学生数据\n",50);
			   gotoxy(8,30);
			  printf("3  打印学生数据\n",50);
			   gotoxy(9,30);
			  printf("4  获取当前学生的总人数\n");
  			    gotoxy(10,30);
              printf("5  转置当前链表\n");
			 // printf("5  清空当前的链表\n");
			  //  gotoxy(10,30);
			  printf("请输入你所选择的功能编号\n");
			  int select;
			  cin>>select;
			  switch(select)
			  {
			  case 1: 
			 jixu=true;
				 while(jixu)
				 {   
						  printf("所要插入的学生的数学成绩 :  ");
								  StudentData data;
								     cin>>data.math;
	                       printf("所要插入的学生的英语成绩 :  ");
						      cin>>data.English;
							printf("所要插入的学生的语文成绩 :  ");
						       cin>>data.Chinese;
									if(	InsertSingleLinkList(l,1,data)==1)
								{ 
										printf("录入学生数据成功\n");
											printf("打印当前学生的数据\n");
										  PrintSingleLinkList(l);    
								}
								else 
								{
									    printf("插入数据失败\n");
								}
											int x;
											x=MessageBox(GetForegroundWindow(),"您还继续添加操作吗","提示框",1);
											if(x==1)
										{
												jixu=true;
										}
											else 
										{
												jixu=false;
										}
				 }
				 system("cls");//清空窗口
				  goto a;
			  case 2:
				  while(jixu2)
				  {
                     printf("请输入所要删除的位置\n");
				   int scope2=SingleLinkListLength(l);
					   printf("提示信息当前学生的总数为%d,所以正确的范围为1---%d\n",scope2,scope2);
					   int delete_index;
				       cin>>delete_index;
                   	if(DeleteSingleLinkList(l,delete_index)==1)
					{ 
						printf("删除成功!\n");
					}
					else 
					{
						printf("删除失败\n");
					}
						int x;
						x=MessageBox(GetForegroundWindow(),"您还继续删除操作吗","提示框",1);
						if(x==1)
						{
							jixu2=true;
						}
						else 
						{
							jixu2=false;
						}
				 }
                   system("cls");//清空窗口
				  goto a;
			  case 3:
                  PrintSingleLinkList(l); 
				     Sleep(2000); 
                       system("cls");//清空窗口
			    	goto a;
			  case 4:
              	printf("当前链表的长度%d\n",SingleLinkListLength(l));
				   Sleep(2000); 
                    system("cls");//清空窗口
				      goto a;
			  case 5:
				  printf("当前链表的数据信息为\n");
                    PrintSingleLinkList(l);
				      printf("转置后的链表信息为\n");
                        PrintSingleLinkList(reverse(l)); 
                           Sleep(20000); 
                            system("cls");//清空窗口
              default :
	                 ClearSingleLinkList(l);
					  DestroySingleLinkList(l);
					   printf("退出系统\n");
				        exit(0);
					    break;

			  }
		
}

                                              实现效果

练习资源下载地址:https://pan.baidu.com/s/187EudlF70Ch8TZWuLKzQlw

猜你喜欢

转载自blog.csdn.net/qq_38345598/article/details/83041965