对该内容进行了重新整理,便于大家使用
插入和删除部分大家可以根据个人需求进行更改。
该文章针对的是初学链表的同学,当然啦那些不想写链表的老手也可以直接拿去用。
创建链表的基本思路:
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;
}