源代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>//使用 malloc 需要引入 stdlib.h 头文件
typedef struct Students//定义 Students 链表
{
int num;
int score;
Students *next; //指向下一个元素的指针
}Students;
//函数声明
Students *createLinkedList();//创建链表函数
void putLinkedList(Students *head);//输出链表函数
Students *delLinkedList(Students *head);//删除节点
Students *insertLinkedList(Students *head);//插入节点
int main() // <-------------------------------------------------- main函数在这
{
Students *head;
head=createLinkedList();//调用自定义函数创建链表
putLinkedList(head);//输出链表
head=delLinkedList(head);//删除符合要求的节点
putLinkedList(head);//输出链表
head=insertLinkedList(head);//插入元素
putLinkedList(head);//输出链表
return 0;
}
//自定义函数 <---------------------------------------------------
//建立链表函数
Students *createLinkedList()
{
//建立动态链表
Students *head,*p1,*p2;
p1=(Students *)malloc(sizeof(Students));//开辟内存空间
//键入数据
printf("请输入学号:");
scanf("%d",&p1->num);
//fflush(stdin); //由于是输入 int 类型,所以无需清空输入流
printf("\n");
if(p1->num==0)
{
printf("取消建立链表!\n\n");
return NULL;
}
printf("请输入成绩:");
scanf("%d",&p1->score);
printf("\n");
head=p1;//将p1指向头元素
do
{
p2=(Students *)malloc(sizeof(Students));//开辟内存空间
//键入数据,存入p2
printf("请输入学号:");
scanf("%d",&p2->num);
printf("\n");
if(p2->num==0)
{
printf("退出输入!\n\n");
break;
}
printf("请输入成绩:");
scanf("%d",&p2->score);
printf("\n");
p1->next=p2;
p1=p2;
}while(p2->num!=0);
p1->next=NULL;//将最后一个元素的 next 设为 NULL
p2=NULL;//释放申请的多余的1份空间
return head;
}
//输出链表函数
void putLinkedList(Students *head)
{
if(head==NULL)
{
printf("链表为空!\n");
return;
}
Students *p1;
p1=head;
printf("--------------------------------------------\n");
printf("学号 成绩 本地址 下一地址\n");
printf("--------------------------------------------\n");
do
{
printf("%2d %3d %p %p\n",p1->num,p1->score,p1,p1->next);
p1=p1->next;
}while(p1!=NULL);
printf("--------------------------------------------\n\n");
}
//删除链表函数
Students *delLinkedList(Students *head)
{
if(head==NULL)
{
printf("链表为空!\n");
return head;
}
int num;
Students *p1,*p2;
p1=head;
p2=head->next;
printf("请输入要删除的学生学号:");
scanf("%d",&num);
printf("\n");
//若首元素就是目标,则直接将第二个元素设为首元素,从而完成删除
if(head->num==num)
{
head=head->next;
return head;
}
//若首元素不是目标,则要在链表中找到该学生
do
{
if(p2->num==num)//找到了
{
p1->next=p2->next;
p2->next=NULL;
p2=NULL;
printf("目标已删除!\n");
return head;
}
p1=p2;
p2=p2->next;
}while(p2!=NULL);
//若全部找完都没有通过 return 结束函数,则该学生不存在
printf("该学生不存在!\n");
return head;
}
//插入链表
Students *insertLinkedList(Students *head)
{
printf("*插入元素*\n");
int num;
Students *p0,*p1,*p2;
p0=(Students *)malloc(sizeof(Students));
printf("请输入学号:");
scanf("%d",&p0->num);
printf("\n");
printf("请输入成绩:");
scanf("%d",&p0->score);
printf("\n");
p0->next=NULL;
printf("请输入要插入在哪个元素之后:");
scanf("%d",&num);
p1=head;
p2=head->next;
//在链表中找到该学生
do
{
if(p1->num==num)//找到了
{
p1->next=p0;
p0->next=p2;
return head;
}
p1=p2;
p2=p2->next;
}while(p1!=NULL);
//若全部找完都没有通过 return 结束函数,则该学生不存在
printf("该学生不存在!\n");
return head;
}
结果