数据结构之链表--单链表

Hello,大家好!好久不见了,之前一直在忙于一些琐事,最近半个月内会将数据结构的各种数据结构实现出来,一个挺有意思的东西。

这次我将要介绍的是链表。链表有单链表,单向循环链表,双向链表,双向循环链表。其实这些理解透彻了还是很简单的,接下来我将给大家一一介绍,欢迎大家收藏点赞。

首先链表的定义是:线性表的链式存储结构称为链表。每个节点包含数据域和找到下一个数据的地址的变量--在C语言中是指针。概念先介绍到这里吧!

以下是我的理解写出来的代码,如有可以优化的地方欢迎大家指出。

注意:代码都经过实际检验。

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

typedef struct Node
{
    int data;        //数据域
    Node * next;     //指针域
}Node;
//创建表头
Node * createList()
{
    Node* headNode = (Node*)malloc(sizeof(Node));
    headNode->next=NULL;
    return headNode;
}
//创建节点
Node * createNode(int data)
{

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

}



//头插
void headInsertNode(Node * headNode,int data)
{
	Node * pMove =createNode(data);
	//此地方要注意先要将头节点后头的节点地址保存到新节点的next域之中
	//再将新节点的地址保存到头节点的后头---先连后断
	pMove->next = headNode->next;
	headNode->next = pMove;
	
}
//尾插
void tailInsertNode(Node *headNode, int data)
{
	//尾插先要找到链表的尾部
	Node * pMove = headNode->next;
	Node * newNode = createNode(data);
	while (pMove->next!=NULL)
	{
		pMove = pMove->next;
	}
	pMove->next = newNode;
}
//注意指定位置插入数据是插在指定位置之前,且是查找到的第一个指定元素之前插入
void posInsertNode(Node * headNode,int updata,int data)
{
	Node * newNode = createNode(updata);
	Node * proNode = headNode;
	Node * posNode = headNode->next;
	while (posNode->data!=data)
	{
		if (posNode->next == NULL)
		{
			printf("你想插入的数据不存在\n");
			return;
		}
		proNode = posNode;
		posNode = posNode->next;
	}
	newNode->next = posNode;
	proNode->next = newNode;
}
//查找结点
void findNode(Node * headNode, int data)
{
	Node* pMove = headNode->next;
	int x = 1;
	while (pMove->data!=data)
	{
		++x;
		pMove = pMove->next;
	}
	if (pMove->data == data)
		printf("你想要查找的数据%d,在链表的第%d个位置\n", data, x);
	else
		printf("你想要找的数据%d并不存在!\n", data);

}
//改变指定位置的数据
void modifyNodeData(Node *headNode, int upData, int data)
{
	Node * pMove = headNode->next;
	while (pMove->data!=data)
	{
		pMove = pMove->next;
	}
	pMove->data = upData;

}
//删除元素
void deleteNodeData(Node * headNode, int data)
{
	Node * proNode = headNode;
	Node * pMove = headNode->next;
	while (pMove->data != data)
	{
		proNode = pMove;
		pMove = pMove->next;
	}
	proNode->next = pMove->next;
	free(pMove);
}
//打印节点的数据
void printNode(Node * node)
{
	Node * pMove = node->next;
	while (pMove)
	{
		printf("%d-->", pMove->data);
		pMove = pMove->next;
	}
	printf("\n");
}
int main()
{

	Node * list = createList();
	
	for (int i = 0; i < 10; i++)
	{

		headInsertNode(list, i);
	}
	printNode(list);
	for (int i = 9; i < 15; i++)
	{
		tailInsertNode(list, i);
	}
	printNode(list);
	posInsertNode(list, 78, 73);
	printNode(list);
	findNode(list, 5);
	printNode(list);
	modifyNodeData(list, 45, 5);
	printNode(list);
	deleteNodeData(list, 6);
	printNode(list);
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值