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);elseprintf("你想要找的数据%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;
}