c链表的练习

来源:互联网 发布:闪电网络是什么 编辑:程序博客网 时间:2024/05/21 07:52

今天在整理资料时,突然发现一些以前自己学c数据结构时写的一些程序,传个上来,保不准以后还有点用的。。。奋斗

/********************************************************************/*程序功能:c实现的链表进行简单的学籍管理/*编程人员:Ting/*******************************************************************#include<stdio.h>#include<memory.h>#include<stdlib.h>#include<string.h>/***************定义链表********************************************/typedef unsigned char Status;#define OK    1#define ERROR 0typedef 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 ************************************/

原创粉丝点击