今天在整理资料时,突然发现一些以前自己学c数据结构时写的一些程序,传个上来,保不准以后还有点用的。。。
/********************************************************************
/*程序功能:c实现的链表进行简单的学籍管理
/*编程人员:Ting
/*******************************************************************
#include<stdio.h>
#include<memory.h>
#include<stdlib.h>
#include<string.h>
/***************定义链表********************************************/
typedef unsigned char Status;
#define OK 1
#define ERROR 0
typedef struct
{
unsigned char num; //学号
unsigned char score; //分数
}List_Elem; //定义链表的结点数据
typedef struct LNode
{
List_Elem Student_Msg;
LNode *Next;
}; //定义链表结点
/********************************************************************
* 名称 : LNode * CreateList(unsigned char NodeNum)
* 功能 : 建立单链表,该链表包含一个头结点
* 输入 : NodeNum---链表的结点数(0~255)
* 输出 : LNode *---链表的头结点的指针
********************************************************************/
LNode * CreateList(unsigned char NodeNum)
{
LNode *p=NULL;
LNode *pt=NULL;
LNode *List=NULL;
if(NodeNum<0)//若结点数参数不合理,则报错
{
return NULL;
}
List=(LNode *)malloc(sizeof(LNode));//取得一个头结点
List->Student_Msg.num=0;
List->Student_Msg.score=0;
List->Next=NULL;//头结点的后继指针要清零,方便构建空表
pt=List;//将头结点缓存起来,做返回值
for(unsigned char i=0;i<NodeNum;i++)
{
p=(LNode *)malloc(sizeof(LNode));//取得一个结点
if(p==NULL)return NULL;
p->Student_Msg.num=0;
p->Student_Msg.score=0;
//p->Student_Msg.num=i+1;//调试用
//p->Student_Msg.score=i+1;
p->Next=NULL;//把新结点的后继指针清零
List->Next=p;//把新结点连接到前驱的后继指针域
List=p;//更新指向最后一个结点的指针
}
List=pt;//将头结点的指针作为返回值
pt=NULL;//清零临时的指针变量
return List;
}
/********************************************************************
* 名称 : unsigned char GetListLength(LNode *List)
* 功能 : 返回单链表的长度,头结点不计算在内
* 输入 : LNode *List---要求长度的链表的指针
* 输出 : 返回链表长度(0~255)
********************************************************************/
unsigned char GetListLength(LNode *List)
{
unsigned char n=0;
while(List->Next != NULL)
{
n++;
List=List->Next;
}
return n;
}
/********************************************************************
* 名称 :Status AddListElem(LNode *List,List_Elem Elem,unsigned char i)
* 功能 :在链表的i(1-254)位置增加一个结点
* 输入 : LNode *List-------链表的头结点指针
List_Elem Elem----结点的数据元素
unsigned char i---增添的位置
* 输出 : ERROR----出错
OK-------完成
********************************************************************/
Status AddListElem(LNode *List,List_Elem Elem,unsigned char i)
{
unsigned char n,j;
n=GetListLength(List);
if(i<0|i>n|i>254)
{//检查参数,这里我们约定链表最长为255,所以不允许在255位置增加结点
return ERROR;
}
LNode *pn=(LNode *)malloc(sizeof(LNode));//先获得一个新结点
pn->Student_Msg.num=Elem.num;//初始化新结点的数据元素
pn->Student_Msg.score=Elem.score;
pn->Next=NULL;
if(n==0)//如果是空链表,则直接接到后面
{
List->Next=pn;
return OK;
}
for(j=1;j<i;j++)//将指针指到要增加的位置的结点的前驱
{
List=List->Next;
}
pn->Next=List->Next;//更新新结点的后继指针
List->Next=pn;//更新新结点的前驱
return OK;
}
/********************************************************************
* 名称 : Status DelListElem(LNode *List,unsigned char i)
* 功能 : 删除结点
* 输入 : LNode *List ------链表头结点指针
unsigned char i --要删除的结点位置
* 输出 : ERROR ------------出错
OK ---------------完成
********************************************************************/
Status DelListElem(LNode *List,unsigned char i)
{
unsigned char n,j;
n=GetListLength(List);
if(i<0|i>n)//参数检查
{
return ERROR;
}
for(j=1;j<i;j++)//找到要删掉的结点的前驱的结点指针
{
List=List->Next;
}
List->Next=List->Next->Next;//更新指针
return OK;
}
/********************************************************************
* 名称 : LNode *GetListElem(LNode *List,unsigned char i)
* 功能 : 获取链表的结点
* 输入 : LNode *List ------链表头结点指针
unsigned char i --要删除的结点位置
* 输出 : LNode----指向获取结点的指针
********************************************************************/
LNode *GetListElem(LNode *List,unsigned char i)
{
unsigned char n=0;
unsigned char j=0;
n=GetListLength(List);
if(i<0|i>n)//参数检查
{
return ERROR;
}
for(j=0;j<i;j++)//将指针指到该结点
{
List=List->Next;
}
return List;
}
/**********主函数***************************************************/
LNode *StudentList=NULL;
void AddStudent(void);
void DisOneStudent(void);
void DelOneStudent(void);
void Dis_Con_Meg(void);
void DisAllStudent(void);
int main(void)
{
unsigned char ChooseMenu=0;
char n=0;
StudentList=CreateList(1);
while(1)
{
printf(" \n");
Dis_Con_Meg();
scanf("%c",&n);
fflush(stdin);//清除键盘缓冲流,不然会导致两次输出
switch(n)
{
case '1': DisAllStudent(); break;
case '2': DisOneStudent(); break;
case '3': AddStudent(); break;
case '4': DelOneStudent(); break;
case '0': break;
default : printf("----------- Please Enter 1-4! --------- \n \n");
break;
}
n='0';
}
}
/********************************************************************
* 名称 : void Dis_Con_Meg(void)
* 功能 : 在屏幕上显示菜单
* 输入 : 无
* 输出 : 无
********************************************************************/
void Dis_Con_Meg(void)
{
printf("----------Please choose a menu------------\n");
printf(" (1) Display all students message. \n");
printf(" (2) Display a students(1~99) message. \n");
printf(" (3) Add a student message. \n");
printf(" (4) Delete a student message. \n");
printf("-------Please enter 1-4 to choose!--------\n");
printf("Please Choose(1-4): ");
}
/********************************************************************
* 名称 : void DisAllStudent(void)
* 功能 :
* 输入 : 无
* 输出 : 无
********************************************************************/
void DisAllStudent(void)
{
unsigned char n=0;
LNode *OneStudent=NULL;
n=GetListLength(StudentList);
printf(" \n");
printf(" ------All students message------\n");
printf(" Number Score \n");
for(unsigned char i=1;i<=n;i++)
{
OneStudent=GetListElem(StudentList,i);
printf(" %d %d \n",
OneStudent->Student_Msg.num,OneStudent->Student_Msg.score);
}
printf(" Are you want to exit to main menu? (Y/N):");
while( (getchar()!='Y') );
fflush(stdin);
printf(" --------------------------------\n");
printf(" \n");
}
/********************************************************************
* 名称 : void AddStudent(void)
* 功能 :
* 输入 : 无
* 输出 : 无
********************************************************************/
void AddStudent(void)
{
List_Elem student;
printf("Please enter the student Number:");
scanf("%u",&student.num);
fflush(stdin);
printf("Please enter the student Score:");
scanf("%u",&student.score);
AddListElem(StudentList,student,1);
fflush(stdin);
printf(" Are you want to exit to main menu? (Y/N):");
while( (getchar()!='Y') );
fflush(stdin);
}
/********************************************************************
* 名称 : void DisOneStudent(void)
* 功能 :
* 输入 : 无
* 输出 : 无
********************************************************************/
void DisOneStudent(void)
{
LNode *OneStudent=NULL;
unsigned char n=0;
printf("Please enter the student Number:");
scanf("%u",&n);
fflush(stdin);
printf("\n");
printf(" ------The Students Message------\n");
printf(" Number Score \n");
OneStudent=GetListElem(StudentList,n);
printf(" %d %d \n",
OneStudent->Student_Msg.num,OneStudent->Student_Msg.score);
printf(" Are you want to exit to main menu? (Y/N):");
while( (getchar()!='Y') );
fflush(stdin);
printf(" --------------------------------\n");
printf(" \n");
}
/********************************************************************
* 名称 : void DelOneStudent(void)
* 功能 :
* 输入 : 无
* 输出 : 无
********************************************************************/
void DelOneStudent(void)
{
LNode *OneStudent=NULL;
unsigned char n=0;
printf("Please enter the student Number:");
scanf("%u",&n);
fflush(stdin);
printf(" Are you want to delete? (Y/N):");
while( (getchar()!='Y') );
fflush(stdin);
DelListElem(StudentList,n);
printf("\n");
printf(" Are you want to exit to main menu? (Y/N):");
while( (getchar()!='Y') );
fflush(stdin);
printf(" --------------------------------\n");
}
/************************** END ************************************/