本文实现了一个学生信息管理的单向链表系统。头文件定义了链表结构体(包含学号、姓名、成绩)和基本操作接口。源文件实现了创建/销毁链表、插入/删除/查找节点、判断空链表、获取链表长度等功能,并提供了两种格式的打印函数。测试程序演示了创建链表、添加3个学生节点、查找节点、删除节点及打印链表等操作。系统采用模块化设计,通过函数指针实现灵活的打印方式,内存管理严谨,包含错误处理机制。该链表实现可作为学生信息管理的基础数据结构。
#ifndef_LINKED_LIST_H_#define_LINKED_LIST_H_#defineMAX_NAME_LEN14typedefenumStatus{ERROR,OK,NO=0,YES}Status;typedefstructStu{intstu_id;charname[MAX_NAME_LEN];floatscore;}Stu,Data;typedefstructNode{Data data;structNode*next;}Node,*pNode,*link;//1创建一个链表linkcreate_list();//销毁一个链表voiddestroy_list(link*link);//插入一个节点Statusinsert_node(link link,Stu stu);//查找一个节点pNodefind_node(link link,intstuid);//删除一个节点Statusdelete_node(link link,intstuid);//链表是否为空Statusis_empty(link link);//链表一共有多少个节点intget_link_size(link link);//打印一个信息voidprint_one_stu1(Stu stu);voidprint_one_stu2(Stu stu);voidprint_Node(pNode node,voidprint(Stu stu));voidprint_link(link link,voidprint(Stu stu));#endif#include"linked_list.h"#include<stdlib.h>#include<string.h>#include<stdio.h>linkcreate_list(){pNode p=(pNode)malloc(sizeof(Node)*1);if(!p){perror("malloc error~!\n");exit(-1);}p->data.stu_id=0;strcpy(p->data.name,"");p->data.score=0.0f;p->next=NULL;returnp;}//[] 1 2 3 4 5voiddestroy_list(link*link){if(*link==NULL){return;}Node*current=*link;while(current!=NULL){Node*tmp=current;current=current->next;free(tmp);}*link=NULL;return;}Statusinsert_node(link link,Stu stu){if(link==NULL){returnERROR;}pNode new_node=(pNode)malloc(sizeof(Node)*1);if(!new_node){perror("malloc error~!\n");exit(-1);}new_node->data=stu;new_node->next=NULL;pNode p=link;while(p->next!=NULL){p=p->next;}p->next=new_node;returnOK;}pNodefind_node(link link,intstuid){if(link==NULL||link->next==NULL){returnNULL;}pNode current=link->next;while(current!=NULL){if(current->data.stu_id==stuid){returncurrent;}current=current->next;}returnNULL;}Statusdelete_node(link link,intstuid){if(link==NULL&&link->next){returnERROR;}pNode current=link;while(current->next!=NULL&¤t->next->data.stu_id!=stuid){current=current->next;}if(current->next==NULL){returnERROR;}Node*tmp=current->next;current->next=tmp->next;free(tmp);returnOK;}voidprint_one_stu1(Stu stu){printf("%d\t%s\t%.2f\n",stu.stu_id,stu.name,stu.score);}voidprint_one_stu2(Stu stu){printf("%d\n%s\n%.2f\n",stu.stu_id,stu.name,stu.score);}voidprint_Node(pNode node,voidprint(Stu stu)){print(node->data);}Statusis_empty(link link){if(link==NULL||link->next==NULL)returnOK;returnNO;}intget_link_size(link link){if(link==NULL||link->next==NULL)return0;size_t size=0;pNode current=link->next;while(current){size+=1;current=current->next;}returnsize;}voidprint_link(link link,voidprint(Stu stu)){if(link==NULL||link->next==NULL)return;pNode current=link->next;while(current){print(current->data);current=current->next;}return;}#include"linked_list.h"#include<stdio.h>#include<stdlib.h>voidtest(){link link=create_list();Stu s1={1001,"libai",99.0f};//shift + alt + 下Stu s2={1002,"libai2",92.0f};Stu s3={1003,"libai3",99.0f};insert_node(link,s1);insert_node(link,s2);insert_node(link,s3);pNode p=find_node(link,1011);if(p)print_Node(p,print_one_stu2);if(p)print_Node(p,print_one_stu1);print_link(link,print_one_stu1);Status status=delete_node(link,1001);printf("%s\n",status?"成功删除":"没找到");print_link(link,print_one_stu1);destroy_list(&link);if(link!=NULL){free(link);link=NULL;}}intmain(){test();return0;}