【C语言】动态单链表的创建、插入、删除

源代码

#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;
}

 

结果

 

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值