/*
* C语言风格的单向链表功能
* Date: 2021/1/30
* Author:phil616@126.com
*/
#include <cstdio> //可换成stdio.h示例程序除测试输出外没有其他流操作
#include <malloc.h> //C语言链表实现需要malloc库的支持,不讨论C++的情况
typedef int DataType; //定义数据类型
struct LinkedList
{
DataType data; //数据域 储存当前节点的一个数据
struct LinkedList *next; //指针域 指向下一个同样类型结构体的指针
// struct LinkedList *prev; //指针域 指向前一个节点,此示例为单向链表,不需要此指针
};
typedef LinkedList Node; //定义节点别名
Node *newNode() { //新建节点函数
Node *nodeptr = NULL; //储存新开辟的空间的地址指针
nodeptr = (Node *)malloc(sizeof(Node)); //开辟新空间
if (nodeptr == NULL) { //判断是否开辟成功
printf("Memory allocate failed\n"); //分配失败报错
}
return nodeptr; //返回新空间的地址
}
Node *deleteNextNode(Node *delptr) { //删除下一个节点功能的函数,参数是要删除节点的前一个
Node *fixedPtr = NULL; //定义一个固定指针并置空,该固定指针指向传入的当前节点
fixedPtr = delptr; //指针固定
delptr = delptr->next; //删除指针移动至要删除的节点
fixedPtr->next = delptr->next; //将要删除的节点指针域传回固定指针,保持连续性
free(delptr); //释放空间
return fixedPtr; //返回当前节点地址
}
Node *releaseList(Node *releaseHead) { //析构整个链表,逐个销毁
Node *movePtr = NULL; //移动指针置空
for (movePtr = releaseHead; releaseHead->next != NULL; movePtr = releaseHead) {
//init将移动指针固定到头节点;判断当前节点是否为最后一个节点;移动指针换位
releaseHead = releaseHead->next; //当前节点换位
free(movePtr); //销毁移动指针指向的节点
}
free(releaseHead); //如果是最后一个节点,则无法在循环中销毁,只能在循环结束后销毁
return NULL;
}
void ShowNodeData(Node *ptr) { //数据域显示函数,用于打印数据域内的所有数据
printf("%d\n", ptr->data); //当前数据域只有这一个类型
}
void traverseList(Node *traverseStart) { //遍历节点函数,参数是遍历头节点,从头节点开始遍历
do
{
ShowNodeData(traverseStart); //调用显示函数,用于显示数据域的信息
traverseStart = traverseStart->next;
} while (traverseStart->next!=NULL);
//无需返回值
}
DataType writeNodeData(DataType Var) { //数据域写入值封装函数
return Var;
}
Node *swapNextTwoNode(Node *prevnode) { //节点互换函数,用于交换后面两个节点
Node *ptr = prevnode;
Node *fixed1, *fixed2;
fixed1 = prevnode->next; //先固定两个交换的节点
fixed2 = prevnode->next->next; //prevnode,fix1,fix2,next四个节点分别是1234
prevnode->next = fixed2; //1节点连接3
fixed1->next = fixed2->next; //2节点连接4
fixed2->next = fixed1; //3节点连接2
return prevnode; //连接完成返回原地址
}
Node *createNode(Node *pHead, int number) { //自动创造链表
int i;
for (i = 0; i < number; i++) {
pHead->next = newNode(); //给一个首地址然后分配空间
pHead->data = writeNodeData(i); //数据域写值
pHead = pHead->next; //指针域连接
}
pHead->next = NULL; //尾指针置空
return pHead;
}
int LinkedList() {
Node *head, *ptr;
head = newNode();
ptr = head;
ptr = createNode(head,5);
swapNextTwoNode(head); //返回值被忽略
traverseList(head);
releaseList(head); //返回值被忽略
return 0;
}