数据结构 用链表实现学生信息管理系统

合集下载

数据结构 用链表实现学生信息管理系统

数据结构 用链表实现学生信息管理系统

3、4、7、#include <iostream>using namespace std;//实现线性表的链式存储结构的类型定义typedef int Elemtype;#define OK 1;#define ERROR -1;struct NODE //结点类型{Elemtype elem;NODE *next;};struct LINK_LIST //链表类型{NODE *head;};//典型操作的算法实现//初始化链表Lint InitList(LINK_LIST *L){L->head = (NODE*)malloc(sizeof(NODE)); //为头结点分配存储单元if (L->head) {L->head->next=NULL; return OK;}else return ERROR ;}//销毁链表Lvoid DestoryList(LINK_LIST *L){NODE *p;while (L->head) //依次删除链表中的所有结点{p=L->head; L->head=L->head->next;free(p);}}//清空链表Lvoid ClearList(LINK_LIST *L){NODE *p;while (L->head->next){ //p指向链表中头结点后面的第一个结点p=L->head->next;L->head->next=p->next; //删除p结点free(p); //释放p结点占据的存储空间}}//求链表L的长度int ListLength(LINK_LIST L){NODE *p;int len;len=0;for(p=L.head;p->next!=NULL; p=p->next)len++ ;return(len);}// 判链表L空否。

C语言链表学生管理系统代码-数据结构01

C语言链表学生管理系统代码-数据结构01
while(p != NULL)
{
if( !strcmp(name, p->) )
{
printf("\n学号\t姓名\t成绩\n");
printf("%d\t%s\t%d\n", p->data.num, p->, p->data.price);
# include <stdio.h>
# include <time.h>
# include <malloc.h>
# include <string.h>
typedef struct {
int num;
char name[20];
int price;
}Student;
printf("请输入要读取的位置:");
if( !scanf("%d", &pos) )
{
printf("您输入的位置格式出错,请输出阿拉伯数字!\n");
fflush(stdin);
return;
}
fflush(stdin);
if(pos <= 0){printf("输入的位置不能为负数。\n");return;}
{
printf("您输入的成绩格式出错,请输出阿拉伯数字!\n");
free(p);
fflush(stdin);
return;
}
fflush(stdin);
pLast->next = p;
p->next = NULL;

C语言程序设计实验实验报告7

C语言程序设计实验实验报告7

C语言程序设计实验实验报告7实验名称:链表实现学生信息管理系统实验目的:通过设计链表实现学生信息管理系统,掌握链表的操作方法及其应用。

实验内容:设计一个学生信息结构体,包括学号、姓名、性别、年龄和成绩五个成员变量,并选择链式结构存储这些数据。

实现以下功能:1. 添加学生信息:从键盘输入学号、姓名、性别、年龄和成绩等信息,添加到链表中。

2. 删除学生信息:从链表中删除指定学号的学生信息。

5. 按成绩排序:按学生的成绩从高到低排序,并输出所有学生的信息。

7. 退出程序:退出学生信息管理系统。

实验方法:1. 设计学生信息结构体,定义链表节点结构体,并编写初始化链表和销毁链表的函数。

2. 编写添加学生信息函数,新建链表节点并插入链表末尾。

3. 编写删除学生信息函数,根据学号查找需要删除的节点,先将该节点从链表中删除,再释放节点空间。

4. 编写修改学生信息函数,根据学号查找需要修改的节点,并修改其成员变量。

6. 编写按成绩排序函数,使用冒泡排序法对链表进行排序,并输出所有学生的信息。

7. 编写输出所有学生信息函数,遍历链表并输出每个节点的信息。

8. 完成学生信息管理系统的主函数,实现菜单及相应功能的选择。

实验结果:依次选择菜单中的各个功能,添加、修改、删除、查找、排序和输出学生信息都能实现。

经测试,程序稳定运行,功能正常,符合需求。

本次实验主要让我们掌握了链式结构的概念、链表节点的定义、链表的初始化、插入、查找、删除和销毁链表的操作方法,以及在实际应用中如何使用链表来实现数据管理。

虽然链表操作相对于数组稍微有些繁琐,但其可以灵活处理数据结构的长度变化,具有更高的可扩展性和更好的操作效率,可以更好的适应各种实际需求。

在实验中,还需要注意节点指针的正确使用、各个函数之间的调用关系和输入输出数据格式的合理选择等问题,以保证程序能够正常运行。

同时,还需要保持认真细致的态度,严格按照实验需求和要求来完成每个步骤,以达到更好的实验效果和运行效率。

数据结构:运用单链表 制作 学生成绩管理系统

数据结构:运用单链表 制作 学生成绩管理系统

单链表操作的实现
int GetElem(Node* head, int i) // 取第i个数据元素 void Insert(Node *head, int i, int d) // 插入数据元素
void Delete(Node *head, int i)
void Clear(Node *head) Node * CreateList(int n)
学生成绩管理系统
Team Members
Content
单链表
1 2 3 4
介绍 操作实现 删除结点 插入结点
学生成绩管理系 运行结果
4
单链表
头指针
头结点
链表为空时, 头结点的指针域为空
空指针

a1
a2
… ... an ^
有时为了操作方便,在第一个结点之前虚 加一个“头结点”,以指向头结点的指针 为链表的头指针。
利用单链表实现四大功能:
(1)输入记录: (2)查询记录: (3)更新记录: (4)输出记录:
主控main()函数的执行流程
若选1 调用add_record()函数,增加学生记录; 若选2 调用delete_record()函数,进行删除操作; 若选3 调用search_record()函数,进行查询操作; 若选4 调用modify_record()函数,进行修改操作;
// 删除数据元素
// 清除链表 // 生成含 n 个数据元素的链表
单链表操作:
(1)单链表中删除节点的示意图如下:
算法表示:p1->next=p2->next;
(2)单链表中插入节点的示意图如下:
算法表示:s>next=p->next;p->next=s;

学生管理系统链表数据结构课程设计

学生管理系统链表数据结构课程设计

课程设计任务书1、题目:学生信息管理系统2、设计内容及要求:内容:完成简单的学生信息管理系统要求:(1)学生信息包括:学号、姓名、平时成绩、期末考试成绩;(2)用单链表存放学生信息;(3)实现简单的菜单调用;(4)程序的功能包括:学生信息链表的建立;学生信息的插入;学生信息的查询;学生信息的修改;学生信息的删除;学生信息的输出。

编写算法,编码实现基本要求。

3.设计时间:6 月27 日-7 月1 号目录一、需求分析--------------------- 3二、概要设计----------------------4三、详细设计----------------------6四、调试分析--------------------- 14五、用户使用说明----------------- 14六、测试结果--------------------- 17七、附录(略)---------------------- 17一.需求分析分析课程设计任务书,本次数据结构课程设计的任务是利用数据结构中所学的相关知识编程设计实现一个学生信息管理系统,使该系统可以方便的查询学生的各项信息和方便管理。

根据任务书中的第五条要求,为来使用者方便使用。

需给出输入、插入、查询、修改、显示等功能。

根据上面的需求分析,画出程序的功能模块图大致如下:系统设计流程图二、概要设计根据上面所述的需求分析,结合我们学过的数据结构知识,要想在计算机中储存学生的信息,可以使用顺序存储和链式存储两种数据类型下面给出本程序用到抽象数据类型定义:ADT List{数据对象:D={ai|ai∈ElemSet,i=1,2,…,n,n≥0 }数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,…,n}基本操作P:InitList(&L);操作结果:构造一个空的线性表L。

DestroList(&L);初始条件:线性表L已存在。

用链表实现学生信息存储系统

用链表实现学生信息存储系统

#include <stdio.h>#include <stdlib.h>#include <string.h>#define PF printf#define LEN sizeof(struct student)//◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆定义结构体◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆struct student{char NO[20];char name[20];int age;char sex[3]; /*'F'表示性别男,'M'表示性别女*/char birthday[10];char address[30];char phone[20];char e_mail[20];struct student *next; //下个结点};typedef struct student STU;STU *head=NULL; //全局指针int n,i=0; //全局变量//◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆自定义函数◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆void show_menu(); //显示菜单void menu(); //执行菜单void creat_stu(); //建立链表void insert_stu(); //学生信息录入void print_stu(); //学生信浏览void search_NO(); //以学号方式查询信息void search_name(); //以姓名方式查询信息void arrage_stu(); //排序void del_stu(); //删除学生信息void revise_stu(); //修改学生信息void save(); //保存信息void main(){creat_stu();menu();}//◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆创建链表◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆void creat_stu(){FILE *fp;long size;STU *p1,*p2;head=(STU *)malloc(sizeof(STU));head->next=NULL;if((fp=fopen("fname.txt","r"))==NULL){printf("这是新表\n");return;}fseek(fp,0L,2);size=ftell(fp);if(!size){printf("这是空表\n");return;} //开始创建链表rewind(fp); //移动到文件首p2=head->next; //找到但前位置while(!feof(fp)){p1=(STU *)malloc(sizeof(STU));fscanf(fp,"%s %s %d %s %s %s %s %s\n",p1->NO,p1->name,&p1->age,\p1->sex,p1->birthday,p1->address,p1->phone,p1->e_mail);p1->next=NULL;//创建节点完if(head->next==NULL)head->next=p1;elsep2->next=p1;p2=p1;n++;}p2->next=NULL;fclose(fp);//◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆执行菜单◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆void menu(){int c;show_menu();while(1){scanf("%d",&c);switch(c){getchar();case 1:insert_stu();break;case 2:print_stu();break;case 3:search_NO(); break;case 4:search_name(); break;case 5:del_stu(); break;case 6:revise_stu(); break;case 7:arrage_stu();break;case 0:exit(0);} //执行菜单选项show_menu();}}//◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆显示菜单◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆void show_menu(){PF("\n");PF("\n※※※※※※※※※※※※※※※※※※菜单※※※※※※※※※※※※※※※※※※\n");PF("\t\t◆1.输入学生信息◆\n");PF("\t\t★2.浏览学生信息★\n");PF("\t\t◆3.以学号方式查询信息◆\n");PF("\t\t★4.以姓名方式查询信息★\n");PF("\t\t◆5.删除学生信息◆\n");PF("\t\t★6.修改学生信息★\n");PF("\t\t◆7 排序◆\n");PF("\t\t★0. 退出★\n");PF("※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n");PF("\n请选择\n");}//◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆学生信息录入◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆void insert_stu() //学生信息录入{n=0;STU *p1=NULL,*p2=NULL;p1=(STU *)malloc(sizeof(STU));PF("\n※※※※※※※※※※※※※※※※※※录入学生信息※※※※※※※※※※※※※※※※※※\n"); //录入学生信息PF("\t\t输入学生学号:\t");scanf("%s",p1->NO); //学号PF("\t\t输入学生姓名:\t");scanf("%s",p1->name); //姓名PF("\t\t输入学生年龄:\t");scanf("%d",&p1->age); //年龄PF("\t\t输入学生性别:\t");scanf("%s",p1->sex); //性别PF("\t\t输入学生出生年月:\t");scanf("%s",p1->birthday); //出生年月PF("\t\t输入学生地址:\t");scanf("%s",p1->address); //地址PF("\t\t输入学生电话:\t");scanf("%s",p1->phone); //电话PF("\t\t输入学生E-mail:\t");scanf("%s",p1->e_mail); //E-mailn++;if(head->next==NULL){head=(STU *)malloc(LEN);head->next=p1;}else{for(p2=head;p2->next!=NULL;p2=p2->next); /*找到最后的结点,然后将增加的结点挂在它上面*/p2->next=p1;}p1->next=NULL;save();//保存到文件}//◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆学生信息浏览◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆void print_stu() //学生信浏览{STU *p=NULL;if(head==NULL) //判断链表是否为空{PF("文档中无记录!\n");return;}for(p=head->next;p!=NULL;p=p->next) //读出信息{PF("※※※※※※※※※※※※※※※※※※学生信息浏览※※※※※※※※※※※※※※※※※※\n");PF("\t\t学生学号:\t%s\n",p->NO);PF("\t\t学生姓名:\t%s\n",p->name);PF("\t\t学生年龄:\t%d\n",p->age);PF("\t\t学生性别:\t%s\n",p->sex);PF("\t\t学生出生年月:\t%s\n",p->birthday);PF("\t\t学生地址:\t%s\n",p->address);PF("\t\t学生电话:\t%s\n",p->phone);PF("\t\t学生E-mail:\t%s\n",p->e_mail);PF("\n");} //输出信息}//◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆学生姓名信息查找◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆void search_name() //学生姓名信息查找{STU *p=NULL;char name[20];if(head==NULL) //判断链表是否为空{PF("文档中无记录!\n");return;}PF("输入学生姓名:");scanf("%s",name);for(p=head->next;p!=NULL;p=p->next) //读出信息{if(!strcmp(p->name,name)){PF("※※※※※※※※※※※※※※※※※※您查找的学生是※※※※※※※※※※※※※※※※※※\n");PF("\t\t学生学号:\t%s\n",p->NO);PF("\t\t学生姓名:\t%s\n",p->name);PF("\t\t学生年龄:\t%d\n",p->age);PF("\t\t学生性别:\t%s\n",p->sex);PF("\t\t学生出生年月:\t%s\n",p->birthday);PF("\t\t学生地址:\t%s\n",p->address);PF("\t\t学生电话:\t%s\n",p->phone);PF("\t\t学生E-mail:\t%s\n",p->e_mail);PF("\n");i=1;}} //输出信息if(!i){PF("无该生信息!请查证:"); } //没找到信息时的处理}//◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆学生学号信息查找◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆void search_NO() //学生学号信息查找{STU *p=NULL;char NO[20];if(head==NULL) //判断链表是否为空{PF("文档中无记录!\n");return;}PF("请输入学生学号:");scanf("%s",NO);for(p=head->next;p!=NULL;p=p->next) //读出信息{if(!strcmp(p->NO,NO)){PF("※※※※※※※※※※※※※※※※※※您查找的学生是※※※※※※※※※※※※※※※※※※\n");PF("\t\t学生学号:\t%s\n",p->NO);PF("\t\t学生姓名:\t%s\n",p->name);PF("\t\t学生年龄:\t%d\n",p->age);PF("\t\t学生性别:\t%s\n",p->sex);PF("\t\t学生出生年月:\t%s\n",p->birthday);PF("\t\t学生地址:\t%s\n",p->address);PF("\t\t学生电话:\t%s\n",p->phone);PF("\t\t学生E-mail:\t%s\n",p->e_mail);PF("\n");i=1;}} //输出信息if(!i){PF("无该生信息!请查证:"); } //没找到信息时的处理}//◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆修改学生信息◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆void revise_stu(){STU *p=NULL;if(head==NULL) //判断链表是否为空{PF("文档中无记录!\n");return;}char NO[20];PF("请输入学生的学号:\t");scanf("%s",NO);for(p=head->next;p!=NULL;p=p->next){if(!strcmp(p->NO,NO)) //验证信息是否正确{PF("※※※※※※※※※※※※※※※※※※您要修改的学生是※※※※※※※※※※※※※※※※※※\n");PF("\t\t学生学号:\t%s\n",p->NO);PF("\t\t学生姓名:\t%s\n",p->name);PF("\t\t学生年龄:\t%d\n",p->age);PF("\t\t学生性别:\t%s\n",p->sex);PF("\t\t学生出生年月:\t%s\n",p->birthday);PF("\t\t学生地址:\t%s\n",p->address);PF("\t\t学生电话:\t%s\n",p->phone);PF("\t\t学生E-mail:\t%s\n",p->e_mail);PF("\n"); //输出要修改信息i=1;PF("※※※※※※※※※※※※※※※※※※修改学号为%s的学生※※※※※※※※※※※※※※※※※※\n",NO);strcpy(p->NO,NO);PF("\t\t输入修改学生姓名:\t");scanf("%s",p->name);PF("\t\t输入修改学生年龄:\t");scanf("%d",&p->age);PF("\t\t输入修改学生性别:\t");scanf("%s",p->sex);PF("\t\t输入修改学生出生年月:\t");scanf("%s",p->birthday);PF("\t\t输入修改学生地址:\t");scanf("%s",p->address);PF("\t\t输入修改学生电话:\t");scanf("%s",p->phone);PF("\t\t输入修改学生E-mail:\t");scanf("%s",p->e_mail);PF("\n"); //输入修改信息save();}}if(!i){PF("无该生信息!请查证:");} /*没找到信息时的处理*/}//◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆删除学生信息◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆void del_stu(){STU *p=NULL;if(head==NULL) //判断链表是否为空{PF("文档中无记录!\n");return;}else{char NO[20];PF("请输入学生的学号:\t");scanf("%s",NO);for(p=head;p!=NULL;p=p->next)if(!strcmp(p->next->NO,NO)) //验证信息是否正确{PF("※※※※※※※※※※※※※※※※※※您要删除的学生是※※※※※※※※※※※※※※※※※※\n");PF("\t\t学生学号:\t%s\n",p->next->NO);PF("\t\t学生姓名:\t%s\n",p->next->name);PF("\t\t学生年龄:\t%d\n",p->next->age);PF("\t\t学生性别:\t%s\n",p->next->sex);PF("\t\t学生出生年月:\t%s\n",p->next->birthday);PF("\t\t学生地址:\t%s\n",p->next->address);PF("\t\t学生电话:\t%s\n",p->next->phone);PF("\t\t学生E-mail:\t%s\n",p->next->e_mail);PF("\n"); //输出要删除的信息i=1;if(p->next->next){printf("第一个\n");p->next=p->next->next;}elsep->next=NULL;n--;save();return;}if(!i){PF("无该生信息!请查证:"); //没找到信息时的处理return;}}}}//◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆按学号排序◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆void arrage_stu(){STU *p1,*p2;int in=0,j;if(head->next==NULL) //首先判断{printf("你还没有记录,无法排序\n");return ;printf("n=%d",n);p1=head->next;for(in=0;in<n-1;in++)for(j=0,p1=head->next;j<=n-in-3;p1=p1->next,j++){if(j==0)//第一次比较第一个和第二个节点信息{if(strcmp(p1->NO,p1->next->NO))//比较p1本身和p1下一个节点{p2=p1->next;p1->next=p1->next->next;p2->next=p1;head->next=p2;p1=head->next;//从新给CUR赋值/*p1=head->next;p1=p2;错误:如果一个变量=他前一个节点的NEXT 那么不可以说把另外一个变量赋给它就可以改变它前一个节点的NEXT 他只能操作后节点*/}}if(strcmp(p1->next->NO,p1->next->next->NO))//比较p1下一个和p1下两个节点{p2=p1->next;p1->next=p1->next->next;p2->next=p1->next->next;p1->next->next=p2;}}if(strcmp(head->next->NO,head->next->next->NO))//只有两个节点信息时直接比较他们两个{p1=head->next;head->next=p1->next;p1->next=p1->next->next;head->next->next=p1;if(n==2) //只有两个节点信息时把第二个节点的next赋为空head->next->next->next=NULL;}}//◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆保存信息◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆void save(){printf("※※※※※※※※※※※※※※※※※※保存信息并结束※※※※※※※※※※※※※※※※※※\n");STU *p=NULL;FILE *fp;char *filename="fname.txt";if((fp=fopen("fname.txt","w"))==NULL) //出错检测{printf("\n打不开文件!\n");return;}if(head->next==NULL){printf("\n信息为空!\n");return;}elsep=head->next;while(p!=NULL){fprintf(fp,"%s %s %d %s %s %s %s %s\n",p->NO,p->name,p->age,p->sex,p->birthday,p->address,p->phone,p->e_mail);//存入文件p=p->next;}printf("保存完毕!\n");fclose(fp);}。

C语言程序设计报告-基于链表的学生信息管理系统

C语言程序设计报告-基于链表的学生信息管理系统

《C语言程序设计实训2》报告设计题目:基于链表的学生信息管理系统学院名称:信息科学技术学院专业:网络工程班级:二班姓名:学号:指导教师:提交日期:一、 实验内容:编写并调试程序,实现学校各专业班级学生信息的管理。

要求一个工程下多个文件。

main 函数以单独的文件main.cpp 存放。

在头文件student.h 中定义学生信息的结构体类型,包括:学号、姓名、专业、班级、3门成绩;和符号常量N (学生数)。

(同一班级的学生可以属于不同的专业,同一专业的学生可以属于不同的班级)。

全局类型的定义如下:二、实验要求:(1) main 函数:以菜单形式将各项功能提供给用户,根据用户的选择,调用相应的函数。

(2) 定义函数STU *CreateList (char * filename ):从二进制文件“studentInfo.dat ”中依次读取12个学生的数据(在文件中学生信息按学号由低到高依次存放),建立带头结点(特殊结点,不放学生信息)的、有序的单链表(链表中各学生信息按学号由低到高依次存放), 返回表头指针。

每次从文件中读一个学生的信息,并将该学生信息插入到链表的表尾。

设置头结点的目的:在链表中第一个学生结点之前插入或者是删除第一个学生结点的时候不必做特殊处理)更灵活的方法:从文件中循环读数据时,根据当前学生信息的next成员的值,决定是否进行下次循环,如果next==NULL,则表明读到最后一个学生信息,循环结束。

(3)定义函数void Output (STU *head):以指向链表头结点的指针为参数,将链表中所有学生的信息表格化输出。

定义函数void OutOneNode(STU *p): 输出参数所指的链表中一个结点的信息。

(4)STU *Max(STU *head):查找总成绩最高的学生,返回指向该学生结点的指针。

考虑特殊情况,找到两个及以上相同最高分同学的情况,如何处理?(5)定义函数STU *Search_num(STU * head ,char *num ):查找指定的学生,返回指向该学生结点的指针。

学生管理系统(链表版)

学生管理系统(链表版)

first=s; } else { q=first; while(q->next !=p)//查找待插入的节点 p 的前驱节点 q q=q->next ; q->next =s;//将新节点 s 插入在 q 和 p 之间 s->next =p; } return first; } //在 first 指向的单链表中,删除学号为 a 的节点 Lnode *delete_(Lnode **first,int a)//学号为 a { Lnode *q=*first,*p=*first; if(*first==NULL) //如果链表为空链表 return NULL; if((*first)->data.num==a)//如果被删除的节点是首节点 { p=*first; *first=(*first)->next; return p; } for(q=*first;q->next;q=q->next)//如果待删除节点是中间节点 { p=q->next; if(p->data.num==a)//找到符合要求的节点 { q->next=p->next;//删除节点 p return p; } } return NULL; } //在 first 指向的单链表中,查找学号为 num 的节点 Lnode *find(Lnode *first,int num) {
//按数学成绩排序的总算法 Lnode *sortmath(Lnode *first); //按平均分成绩排序的总算法 Lnode *sortaverage(Lnode *first); //在 first 指向的单链表中,按 math 排序 Lnode *sort_math(Lnode *first,Lnode *s); //链表的倒置 Lnode *reverse(Lnode *first); //按计算机最大值排序 void maxcomputer(Lnode *first); //按英语最大值排序 void maxenglish(Lnode *first); //按平均分最大值排序 void maxaverage(Lnode *first); //按数学最大值排序 void maxmath(Lnode *first); //在 first 指向的单链表中,按 average 排序 Lnode *sort_average(Lnode *first,Lnode *s);
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3、4、
7、
#include <iostream>
using namespace std;
//实现线性表的链式存储结构的类型定义
typedef int Elemtype;
#define OK 1;
#define ERROR -1;
struct NODE //结点类型
{
Elemtype elem;
NODE *next;
};
struct LINK_LIST //链表类型
{
NODE *head;
};
//典型操作的算法实现
//初始化链表L
int InitList(LINK_LIST *L)
{
L->head = (NODE*)malloc(sizeof(NODE)); //为头结点分配存储单元if (L->head) {L->head->next=NULL; return OK;}
else return ERROR ;
}
//销毁链表L
void DestoryList(LINK_LIST *L)
{
NODE *p;
while (L->head) //依次删除链表中的所有结点
{
p=L->head; L->head=L->head->next;
free(p);
}
}
//清空链表L
void ClearList(LINK_LIST *L)
{
NODE *p;
while (L->head->next){ //p指向链表中头结点后面的第一个结点
p=L->head->next;
L->head->next=p->next; //删除p结点
free(p); //释放p结点占据的存储空间
}
}
//求链表L的长度
int ListLength(LINK_LIST L)
{
NODE *p;
int len;
len=0;
for(p=L.head;p->next!=NULL; p=p->next)
len++ ;
return(len);
}
// 判链表L空否。

int IsEmpty(LINK_LIST L)
{
if (L.head->next==NULL) return true;
else return false;
}
//()通过e返回链表L中第i个数据元素的内容
void GetElem(LINK_LIST *L,int i,Elemtype *e)
{
NODE *p;
int j;
if (i<1||i>ListLength(*L))
exit(-1); //检测i值的合理性
for (p=L->head,j=0; j!=i; p=p->next,j++);
p = L->head;
for (j=0; j<i; j++) //寻找第i-1个结点
p=p->next;
*e=p->elem; //将第i个结点的内容赋给e指针所指向的存储单元中
}
//在链表L中检索值为e的数据元素
NODE *LocateELem(LINK_LIST L,Elemtype e)
{
NODE *p;
for (p=L.head->next;p&&p->elem!=e;p=p->next); //寻找满足条件的结点return(p);
}
//返回链表L中结点e的直接前驱结点
NODE *PriorElem(LINK_LIST L,NODE* e)
{
NODE *p;
if (L.head->next==e) return NULL; //检测第一个结点
for (p=L.head;p->next&&p->next!=e;p=p->next);
if (p->next==e) return p;
else return NULL;
}
//返回链表L中结点e的直接后继结点
NODE *NextElem(LINK_LIST L,NODE* e)
{
NODE *p;
for(p=L.head->next;p&&p!=e;p=p->next);
if (p) p=p->next;
return p;
}
//在链表L中第i个数据元素之前插入数据元素e
int ListInsert(LINK_LIST *L,int i,Elemtype e)
{
NODE *p,*s;
if (i<1||i>ListLength(*L)+1) return ERROR;
p=L->head;
for (int j=0; j<i-1; j++) //寻找第i-1个结点
p=p->next;
s=(NODE*)malloc(sizeof(NODE));
if (s==NULL) return ERROR;
s->elem=e;
s->next=p->next; p->next=s; //将s结点插入
return OK;
}
//将链表L中第i个数据元素删除,并将其内容保存在e中。

int ListDelete(LINK_LIST *L,int i,Elemtype *e)
{
NODE *p, *s;
if (i<1||i>ListLength(*L)) return ERROR; //检查i值的合理性p=L->head;
for(int j=0;j<i-1;j++) //寻找第i-1个结点
p=p->next;
s=p->next; //用s指向将要删除的结点
p->next=s->next; //删除s指针所指向的结点
*e=s->elem;
free(s);
return OK;
}
void main()
{
LINK_LIST NL;
InitList(&NL);
cout<< IsEmpty(NL)<<endl;
int a,b;
a = 11;
ListInsert(&NL,1,a);
a=21;
ListInsert(&NL,1,a);
a=31;
ListInsert(&NL,1,a);
cout<< IsEmpty(NL)<<endl;
GetElem(&NL,1,&b);
cout<< b <<endl;
GetElem(&NL,2,&b);
cout<< b<<endl;
GetElem(&NL,3,&b);
cout<< b<<endl;
ListDelete(&NL,1,&a);
GetElem(&NL,1,&b);
cout<< b <<endl;
DestoryList(&NL);
getchar();
}。

相关文档
最新文档