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