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