学生成绩管理系统链表实现
2016-11-19 13:33
816 查看
2016年7月11日18:02:51 链表的相关术语: 头结点:1.为什么需要头结点? 为了方便对链表的操作,因而需要头结点; 2.头结点是什么? 链表的第一个节点,首节点前面那节点,但该节点不保存有效数据; 首节点:首节点是链表中第一个保存有效数据的节点; 尾节点:尾节点是链表中最后一个保存有效数据的节点,该节点的指针域为空; 头指针:保存头结点地址的指针变量为头指针; 确定一个链表至少需要那几个参数?(或者说:如果要用一个函数来处理一个链表,那么该函数至少需要接受链表那几个参数) 确定一个链表只需要一个参数:头指针 这是因为,由链表的头指针可以找到链表的头结点,根据头结点的指针域可以找到链表的首节点,一直往后找知道找到链表的最后一个 节点,即尾节点,因此由头指针可以确定一个链表; 链表的创建是动态的分配内存还是静态的分配内存? 动态的分配内存:如果静态分配内存,那么一旦创建链表的函数执行完毕,那么系统就会自动释放静态内存空间, 而动态内存分配程序员可以通过编程来手动分配动态内存,也可以由程序员手动编程来释放动态内存.
#include<stdio.h> #include<malloc.h> #include<stdlib.h> //学生基本信息结构体 typedef struct stu { long num; char name[10]; float score; }STUDENT; //链表结构体 typedef struct node { STUDENT data; struct node * pNext; }SNODE; //函数前置声明 SNODE * createList(SNODE * pHead, int len);//尾插法 SNODE * createList1(SNODE * pHead,int len);//头插法 void traverseList(SNODE * pHead);//遍历链表 void inputInfor(SNODE * pNew);//输入信息 SNODE * insertNode(SNODE * pHead,int pos);//插入节点 SNODE * deleteList(SNODE * pHead,int pos);//删除节点 SNODE * initList(SNODE * pHead);//初始化链表 SNODE * locateElem(SNODE * pHead,long num);//根据内容查找 SNODE * getElem(SNODE * pHead,int pos);//根据位置查找 int isEmpty(SNODE * pHead);//判断链表是否为空 void destroyList(SNODE * pHead);//销毁链表 void showMenu(void);//展示菜单 //初始化链表 SNODE * initList(SNODE * pHead) { pHead = (SNODE * )malloc(sizeof(SNODE)); if(NULL == pHead) { printf("动态内存分配失败!\n"); exit(-1); } pHead->pNext = NULL; pHead->data.num = 0; return pHead; } //判断链表是否为空,如果为空返回1,否则返回0 int isEmpty(SNODE * pHead) { if(NULL == pHead->pNext) return 1; else return 0; } //求链表的长度,如果链表为空则返回0,非空则返回链表的长度 int getLength(SNODE * pHead) { SNODE * p; int i = 0; p = pHead->pNext; /*if(1 == isEmpty(pHead)) return 0; else*/ while(NULL != p) { p = p->pNext; i++; } return i; } void destroyList(SNODE * pHead)//销毁链表 { SNODE * pFree,* pCur; pFree = pHead; while(pFree) { pCur = pFree->pNext; free(pFree); pFree = pCur; } return ; } //展示菜单 void showMenu(void) { printf("___________________________________________\n"); printf(" 欢迎使用学生成绩管理系统\n"); printf("\t 【1】创建学生信息\n"); printf("\t 【2】插入学生信息\n"); printf("\t 【3】删除学生信息\n"); printf("\t 【4】显示学生信息\n"); printf("\t 【5】查找学生信息\n"); printf("\t 【6】退出系统\n"); printf("___________________________________________\n\n"); return; } //动态的创建一个链表 SNODE * createList(SNODE * pHead, int len) { SNODE * pNew; SNODE * pTail; pTail = pHead; int i; for( i = 0;i<len;i++) { pNew = (SNODE * )malloc(sizeof(SNODE)); if(NULL == pNew) { printf("动态内存分配失败!\n"); exit(-1); } inputInfor(pNew); pNew->pNext = NULL; pTail->pNext = pNew; pTail = pNew; pHead->data.num ++; } return pHead; } //单链表的创建之尾插法 SNODE * createList1(SNODE * pHead,int len) { SNODE * pNew; int i; for(i = 0;i<len;i++) { pNew = (SNODE * )malloc(sizeof(SNODE)); if(NULL == pNew) { printf("动态内存分配失败!\n"); return NULL; } printf("请输入学生信息!\n"); printf("学号="); scanf("%ld",&pNew->data.num); printf("姓名="); scanf("%s",pNew->data.name); printf("分数="); scanf("%f",&pNew->data.score); /*if( NULL == pHead->pNext) { pNew->pNext = NULL; pHead->pNext = pNew; } else { pNew->pNext = pHead->pNext; pHead->pNext = pNew; } */ pNew->pNext = pHead->pNext; pHead->pNext = pNew; } return pHead; } //输入学生信息 void inputInfor(SNODE * pNew) { printf("请输入学生信息:\n"); printf("学号="); scanf("%ld",&pNew->data.num); printf("姓名="); scanf("%s",pNew->data.name); printf("分数="); scanf("%f",&pNew->data.score); return; } //学生结点的插入 SNODE * insertNode(SNODE * pHead,SNODE * cur,int pos) { SNODE * prev = pHead; int i; while(pos<1||pos>pHead->data.num+1) { return NULL; } for(i = 1;i<pos;i++) { prev = prev->pNext; } /* if(prev->pNext==NULL) { cur->pNext = NULL; prev->pNext = cur; pHead->data.num ++; } else { cur->pNext = prev ->pNext; prev->pNext = cur; pHead->data.num++; } */ cur->pNext = prev ->pNext; prev->pNext = cur; pHead->data.num++; return pHead; } //学生结点的删除 SNODE * deleteNode(SNODE * pHead,int pos ,SNODE * pDelete) { SNODE * prev; SNODE * cur; int i; prev = pHead; if(NULL == pHead->pNext) { printf("链表为空,不能删除元素!\n"); return NULL; } while(pos<1||pos>pHead->data.num) { return NULL; } for(i = 1;i<pos;i++) { prev = prev->pNext; } cur = prev->pNext; /*if(NULL == cur->pNext ) { prev->pNext = NULL; *pDelete = *cur; free(cur); pHead->data.num--; } else { prev->pNext = cur->pNext; *pDelete = *cur; free(cur); pHead->data.num--; } */ prev->pNext = cur->pNext; *pDelete = *cur; free(cur); pHead->data.num--; return pHead; } //根据学生信息内容查找,查找成功返回元素指针,查找失败返回NULL; SNODE * locateElem(SNODE * pHead,long num) { SNODE * p; int pos = 0; p = pHead->pNext; /*if(NULL == pHead->pNext) { return 0; }*/ while(NULL != p) { if(num == p->data.num) { return p; } p = p->pNext; pos++; } return NULL; } //根据学生信息位置查找,查找成功返回元素指针,查找失败返回NULL; SNODE * getElem(SNODE * pHead,int pos) { SNODE * p; int i = 1; p = pHead->pNext; /*if(p == NULL) { return NULL; }*/ while(NULL != p&&i<pos) { p = p->pNext; i++; } if(i == pos) { return p; } else { return NULL; } } //链表的遍历 void traverseList(SNODE * pHead) { int i = 0; SNODE * p = NULL; p = pHead->pNext; printf(" 学号 姓名 分数 \n"); if(NULL == p) { printf("链表为空!\n"); } else { while(NULL != p) { printf("第%d个学生 ",i+1); printf("%-7ld%-7s%-6.2f\n",p->data.num,p->data.name,p->data.score); p = p->pNext; i++; } } return; } //主函数 int main(void) { SNODE * pFound; SNODE * pInsertNode; SNODE pDeleteNode; SNODE * pHead = NULL; int len,pos,choice; pHead = initList(pHead);//初始化链表 while(1) { showMenu();//展示链表的操作 printf("请输入您的选择:"); scanf("%d",&choice); system("cls"); switch(choice) { case 1:printf("请输入原始班级中的人数:"); scanf("%d",&len); pHead = createList(pHead,len); system("cls"); printf("___________________________________________\n"); printf(" 创建的学生信息显示\n"); traverseList(pHead); printf("___________________________________________\n\n"); break; case 2: pInsertNode = (SNODE * )malloc(sizeof(SNODE)); if(NULL == pInsertNode) { printf("动态内存分配失败!\n"); exit(-1); } inputInfor(pInsertNode); while( NULL == insertNode(pHead,pInsertNode,pos)) { printf("___________________________________________\n"); printf(" 插入前学生信息显示\n"); traverseList(pHead); printf("___________________________________________\n\n"); printf("请输入需要插入学生信息的位置:"); scanf("%d",&pos); system("cls"); } printf("___________________________________\n"); printf(" 您需要插入学生显示\n"); printf(" 学号 姓名 分数 \n"); printf(" %-7ld%-7s%-6.2f\n",pInsertNode->data.num,pInsertNode->data.name,pInsertNode->data.score); printf("___________________________________\n\n"); printf("___________________________________________\n"); printf(" 插入后学生信息显示\n"); traverseList(pHead); printf("___________________________________________\n\n"); break; case 3: while( NULL ==deleteNode(pHead,pos ,&pDeleteNode)) { printf("___________________________________________\n"); printf(" 删除前学生信息显示\n"); traverseList(pHead); printf("___________________________________________\n\n"); printf(" 请输入需要删除学生信息的位置:"); scanf("%d",&pos); system("cls"); } printf("___________________________________\n"); printf(" 您需要删除学生显示\n"); printf(" 学号 姓名 分数 \n"); printf(" %-7ld%-7s%-6.2f\n",pDeleteNode.data.num,pDeleteNode.data.name,pDeleteNode.data.score); printf("___________________________________________\n"); printf(" 删除后学生信息显示\n"); traverseList(pHead); printf("___________________________________________\n\n"); break; case 4: system("cls"); printf("___________________________________________\n"); printf(" 该班级学生信息显示\n"); traverseList(pHead); printf("___________________________________________\n\n"); break; case 5: pos = 0; while(pos<1) { printf("请输入您所需要查找元素的学号:\n"); scanf("%d",&pos); system("cls"); } //pFound = getElem(pHead,pos); pFound = locateElem(pHead,pos); if(NULL == pFound) { printf("查找失败!\n"); } else { printf("_______________________________________\n"); printf(" 学号 姓名 分数 \n"); printf("该学生的信息"); printf("%-7ld%-7s%-6.2f\n",pFound->data.num,pFound->data.name,pFound->data.score); printf("_______________________________________\n\n"); } break; case 6:exit(0); default:system("cls"); printf("您的操作有误!\n"); break; } } return 0; }
相关文章推荐
- 链表《5》使用链表实现学生成绩管理系统
- 学生成绩管理系统课程设计(C语言,链表实现)
- c++链表实现学生成绩管理系统(简易版)
- 数据结构——学生成绩管理系统的链表实现
- c用链表实现学生成绩管理系统 MIS
- 用链表写的学生管理系统 成绩的录入与查询都已经是实现了
- 用链表写的学生管理系统 成绩的录入与查询都已经是实现了
- 学生成绩管理系统(链表的实现)
- C语言链表实现的简易学生成绩管理系统
- 链表实现学生成绩管理系统
- 使用C++结合文件操作和链表实现学生成绩管理系统
- 实验一、链表实现学生管理系统
- 学生成绩管理系统C语言代码实现
- C语言实现学生成绩管理系统
- 用单链表实现学生信息管理系统
- 数据结构之链表的实现-------C++课程设计-----学生选课管理系统
- C语言使用单链表的学生成绩管理系统
- 用C++写的学生成绩管理系统(比较简单的没有使用链表,只是用到了类和对象)
- c语言制作的学生成绩管理系统 加链表
- C实现的一个简单的学生成绩管理系统