动态链表的增删查改 学习C语言

大家好~
在学习C语言的过程中,动态链表的相关操作总是会把我弄得有点晕。思路是有的,但是写完代码之后就很容易被自己绕晕。
于是今天想把我在链表的创建、输出、插入删除的过程中出现的问题总结一下,理清一下自己的思路,防止以后再犯同样的错。

链表是线性表的一种,所谓的线性表包含顺序线性表和链表,顺序线性表是用数组实现的,在内存中有顺序排列,通过改变数组大小实现。而链表不是用顺序实现的,用指针实现,在内存中不连续。意思就是说,链表就是将一系列不连续的内存联系起来,将那种碎片内存进行合理的利用,解决空间的问题。

说的通俗一点,就是链表的出现弥补了顺序线性表对空间的浪费问题,同时他的插入和删除元素要比顺序结构简单的多,免去了移动大量元素的缺点
 

链表是一种常见的重要的数据结构。
它是动态地进行存储分配的一种结构。链表有一个头指针变量,它存放一个地址,该地址指向一个元素。
链表中每一个元素称为结点,每个结点都应包括两个部分:一为用户需要用的实际数据,二为下一个结点的地址。
可以看出,头指针 head 指向第一个元素,第一个元素又指向第二个元素……
直到最后一个元素,该元素不再指向其他元素,它称为表尾,它的地址部分放一个 NULL(表示空地址)链表到此结束。

本代码使用头插法外加模块化设计

废话不多说    下面是总代码


/*2021.12.02*/
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
// 什么是链表 链表是结构体变量与结构体变量连接在一起,通过结构体指针连接在一起
// 动态创建一个链表
// 动态内存申请+模块化设计
//  1    创建链表
//  2    创建节点
//  3    插入节点
//  4    删除节点
//  5    打印遍历链表(测试)
//  结构体变量变成 结构体变量


// 
struct student
{
	char name[20];
	int num;
	int math;
};


struct Node
{
	struct student data;  //数据域
	struct Node *next; //指针域

};
struct Node *createList()  //创建链表
{
	struct Node *headNode=(struct Node*)malloc(sizeof(struct Node));
	//headNode->data=1;
	headNode->next=NULL;
	return headNode;
}

struct Node *createNode(struct student data)  //创建节点
{

	struct Node *newNode=(struct Node*)malloc(sizeof(struct Node));
	newNode->data=data;
	newNode->next=NULL;
	return newNode;

}

void printList(struct Node *headNode)  //打印链表
{
	struct Node *pMove=headNode->next ;
	printf("name\tnum\tmath\n");
	while(pMove)
	{
		printf("%s\t %d \t %d\t",pMove->data.name,pMove->data.num,pMove->data.math);
		pMove =pMove->next ;
	    printf("\n");
	}

}
void insertNodeByHead(struct Node *headNode,struct student data)  //表头法插入
{
	struct Node* newNode=createNode(data);
	newNode->next=headNode->next ;
	headNode->next=newNode;


}

void deleteNodeByPostion(struct Node *headNode,int num)  //指定位置删除
{
	struct Node *posNode=headNode->next;
	struct Node *posNodeFront=headNode;
	if(posNode==NULL)
	{
		printf("无法删除链表为空\n");
	}
	else
	{
		while(posNode->data.num!=num)
		{
			posNodeFront=posNode;
			posNode=posNodeFront->next ;
			if(posNode==NULL)
				{
					printf("无法找到相关信息,无法删除\n");
					//	break;
					return ;
				}
				
		}	
		posNodeFront->next=posNode->next ;
		free(posNode);
	}



}


int main()
{
	struct Node *List=createList();
	struct student info;
	char choice=0;
	while(1)
	{
		printf("请输入学生的姓名 学号 数学成绩:");
	    scanf("%s%d%d",info.name ,&info.num ,&info.math );
		insertNodeByHead(List,info);
		printf("continue(Y/N)");
		setbuf(stdin,NULL);  //清空缓冲区
		choice=getchar();
		
		if(choice=='n'||choice=='N')
		{
		
			break;
		
		}
	}

	printList(List);
	printf("请输入要删除的学生的学号:");
	scanf("%d",&info.num );
	deleteNodeByPostion(List,info.num );
	printf("再次打印学生信息\n");
	printList(List);

	system("pause");
	return 0;
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Love coldplay

你的鼓励,将让我持续更新

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值