创建一个链表要将链表各个功能封装成为各个函数进行调用
过程为:
1、定义一个结构体
2、创建链表:创建一个返回值为结构体指针的函数
3、创建结点:(为插入结点函数insertNodeByHead(sn* headNode, int data)服务)
4、头部插入:尾部插入(寻找尾部:需定义一个指针pMove,尾部插入)
5、打印链表:需定义一个指针pMove,while遍历
6、链表指定位置删除:
定义定义头尾操作指针,初始化
判断是否只有头部结点
匹配数据 遍历结点
判断是否遍历到最后一个结点
删除结点操作(两个next直接相连跳过结点)
释放结点
#include<stdio.h>
#include<stdlib.h>
//定义一个结构体
typedef struct Node {
int data;
struct Node* next;
}sn;
//创建链表
//创建一个返回值为结构体指针的函数
sn* creatlist()
{
sn* headNode = (sn*)malloc(sizeof(sn));
//headNode->data = 1;
headNode->next = NULL;
return headNode;
}
//创建结点(为插入结点函数insertNodeByHead(sn* headNode, int data)服务)
sn* creatNode(int data)
{
sn* newNode = (sn*)malloc(sizeof(sn));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
//打印链表
void printList(sn* headNode)
{
sn* pMove = headNode;
while (pMove->next)
{
printf("%d\t", pMove->next->data);
pMove = pMove->next;
}
printf("\n");
//sn* pMove = headNode->next;
//while (pMove)
//{
// printf("%d\t", pMove->data);
// pMove = pMove->next;
//}
//printf("\n");
}
//头部插入
void insertNodeByHead(sn* headNode, int data)
{
//创建插入结点
sn* newNode = creatNode(data);
//插入操作
//sn* temp = headNode->next;
//headNode->next = newNode;
//newNode->next = temp;
///!!!!!!!!!!!!
//切记交换位置 要保证通过headNode->next传递 其值不变
newNode->next = headNode->next;
headNode->next = newNode;
}
//寻找尾部
sn* tailNode(sn* headNode)
{
sn* pMove = headNode;
while (pMove->next)
{
pMove = pMove->next;
}
return pMove;
}
//尾部插入
void insertNodeByTail(sn* headNode, int data)
{
sn* LastNode = tailNode(headNode);
sn* newNode = creatNode(data);
LastNode->next = newNode;
}
//链表指定位置删除
void deleteNodeByAppoint(sn* headNode, int posData)
{
//删除结点 前后两侧位置初始化至头部结点的下一个
sn* posNodeFront = headNode;
sn* posNode = headNode->next;
//判断是否只有头部结点
if (posNode==NULL)
{
printf("无法删除,链表为空\n");
}
else
{
//匹配数据 遍历结点
while (posNode->data!=posData)
{
posNodeFront = posNode;
posNode = posNode->next;
}
//判断是否遍历到最后一个结点
if (posNode==NULL)
{
printf("没有找到相关信息,无法删除\n");
return;
}
//删除结点操作(两个next直接相连跳过结点)
posNodeFront->next = posNode->next;
//释放结点
free(posNode);
}
}
int main(void)
{
//创建链表
sn* stu = creatlist();
//插入数据
insertNodeByHead(stu, 3);
insertNodeByHead(stu, 2);
insertNodeByHead(stu, 1);
//打印结点
printList(stu);
//删除结点
deleteNodeByAppoint(stu, 2);
printList(stu);
//插入结点
insertNodeByTail(stu, 4);
insertNodeByTail(stu, 5);
insertNodeByTail(stu, 6);
insertNodeByTail(stu, 7);
printList(stu);
insertNodeByHead(stu, 1);
insertNodeByHead(stu, 1);
insertNodeByHead(stu, 1);
printList(stu);
insertNodeByTail(stu, 8);
printList(stu);
return 0;
}