链表,头插法,尾插法,删除,打印,注释超详细,Ctrl C就可以直接用;

对该内容进行了重新整理,便于大家使用

插入和删除部分大家可以根据个人需求进行更改。

该文章针对的是初学链表的同学,当然啦那些不想写链表的老手也可以直接拿去用。

创建链表的基本思路:

1.创建一个结构体用来存储数据;

2.创建表头(一般表头不存放数据,本代码表头就不存放数据),就是申请一个内存空间返回一个指针地址;

3.构建一个创建节点的函数,跟创建表头差不多也是申请内存,返回一个指针地址,但多了存储数据这一部分。

4.插入,就是找到要插入的位置,利用传入的数据构造一个节点,把该节点插入找到的位置。

5.删除,就是找到要删除数据的结点,把该节点的前一个结的的next指针指向该节点的下一个结点,再把该结点free掉,(有时候不用free,根据需求而定)。

6.打印链表,就是遍历一遍链表,把数据打印出来。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Node
{
	int data;//可用结构体代替
	struct Node* next;
};

//创建表头
struct Node* createList()
{
	struct Node* headNode = (struct Node*)malloc(sizeof(struct Node));
	//headNode变成一个变量
	//变量使用前初始化
	//headNode->date = 0;//一般不初始化
	headNode->next = NULL;

	return headNode;
};

//创建结点 
struct Node* createNode(int data)
{
	struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
	newNode->data = data;
	newNode->next = NULL;
	return newNode;
}

//插入结点(尾插法) 
void insertNodebyTail(struct Node* headNode, int data)//找到尾指针并把结点接入
{
	struct Node* pmove = headNode;
	while (pmove->next != NULL)
	{
		pmove = pmove->next;
	}
	struct Node* newNode = createNode(data);
	pmove->next = newNode;
}



//插入节点(头插法)

void insertNodebyHead(struct Node* headNode, int data)//自己画个图就懂了
{  
	struct Node* newNode = createNode(data);
	newNode->next = headNode->next;
	headNode->next= newNode;
	
}




//删除结点
void deleteNode(struct Node* headNode, int posDate)//找到数据所在节点,将该结点的前一个结点的next指向该结点的下一结点
{
	struct Node* posNode = headNode->next;
	struct Node* posNodefront = headNode;

	if (posNode == NULL)
	{
		printf("无法删除链表\n");
	}

	else
	{
		while (posNode->data != posDate)
		{
			posNodefront = posNode;
			posNode = posNodefront->next;

			if (posNode == NULL)
			{
				printf("未找到指定结点,无法删除\n");
				return;
			}
		}
		posNodefront->next = posNode->next;

		//return posNode->next;
		free(posNode);//释放内存,如还需利用该结点可不释放内存
	}
}


//打印链表
void printList(struct Node* headNode)
{
	struct Node* pMove = headNode->next;

	while (pMove != NULL)
	{
		printf("%4d", pMove->data);//输出格式可跟据需要调整
		pMove = pMove->next;
	}
	printf("\n");
}


int main()
{ 
	struct Node* list = createList();//创建表头
	struct Node* list1= createList();
	for (int i = 1; i <= 10; i++)
	{
		insertNodebyHead(list, i);//头插插入(12345678910)输出为(10987654321)

	}

	printList(list);
	for (int i = 1; i <= 10; i++)
	{
		deleteNode(list, i);//将链表元素全部删除

	}

	printList(list);

	for (int i = 1; i <= 10; i++)
	{
		insertNodebyHead(list, i);//重新插入,检验元素删除完后链表是否可用;

	}

	printList(list);

	printf("__________________________\n\n");

	for (int i = 1; i <= 10; i++)
	{
		insertNodebyTail(list1, i);//尾插插入(12345678910)输出为(12345678910)  后面操作同上

	}

	printList(list1);
	for (int i = 1; i <= 10; i++)
	{
		deleteNode(list1, i);

	}

	printList(list1);

	for (int i = 1; i <= 10; i++)
	{
		insertNodebyTail(list1, i);

	}

	printList(list1);


	return 0;

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值