link——纯C语言实现单链表的基本操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*
* 功能:单链表的基本操作——C语言
*
* 作者:深度网络社团.Robothy
*
* 时间:2015年9月14日
*/
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
///结构体变量,表示一个学生的所有属性
typedef struct student
{
char stu_name[15],stu_id[10];
float score[2][5];
int term,class_id;
struct student *next;
}Stu,*pStu;
///创建一个单链表,即建立一个链表头,头占内存,但不存学生信息
void create_link(pStu *S)
{
(*S)=(pStu)malloc(sizeof(Stu));
(*S)->next=NULL;
}
///往链表中插入一个节点,头部插入,注意形式参数用的是二级指针
void insert_node(pStu *S,pStu *node)
{
(*node)->next=(*S)->next;
(*S)->next=*node;
}
///往链表中删除一个节点,按照学号或姓名删除,一次只删除一个
void delete_node(pStu *S,char *msg)
{
pStu p=*S;
pStu q=p->next;
while(q)
{
if(!(strcmp(msg,q->stu_id))||!(strcmp(msg,q->stu_name)))///找到节点
{
p->next=q->next;
break;
}
p=q;
q=q->next;
}
if(!q)
{
printf("未找到相应节点!\n");
}
else
{
free(q);///释放内存
printf("学生信息已删除!\n");
}
}
///打印整个链表,也就是对整个链表进行遍历,修改链表中的节点算法类似,注意这里的形式参数传的是一级指针。
void print_link(Stu *S)
{
pStu p=S->next; ///创建链表的时候头部没有存学生数据,所以要从链表的第二个节点开始
printf("\n\n学号\t\t姓名\n------------------------\n");
while(p)
{
printf("%s\t\t%s\n",p->stu_id,p->stu_name); ///这里为了简单只输出学生姓名和学号
p=p->next;
}
}
///从控制台获取一个节点
pStu get_node(void)
{
pStu N = (pStu)malloc(sizeof(Stu));
printf("请输入学号和姓名:\n");
scanf("%s%s",&(N->stu_id),&(N->stu_name));
N->next=NULL;
return N;
}
///释放整个链表的内存,结束程序的时候使用
void free_link(pStu *S)
{
pStu p=(*S);
pStu q=p->next;
while(q)
{
free(p);
p=q;
q=q->next;
}
free(p);
}
int main(void)
{
pStu S; ///声明一个链表
create_link(&S); ///创建一个链表,即分配头指针的内存
pStu N; ///声明一个指向节点的变量
int i=0;
for(;i<3;i++) ///连续插入 i 个节点
{
N = get_node();
insert_node(&S,&N);
}
print_link(S); ///打印整个链表
delete_node(&S,"123"); ///删除学号或姓名为123的学生
print_link(S); ///再次打印链表
free_link(&S);
return 0;
}