欢迎交流与讨论。
#include "stdlib.h"
#include "stdio.h"
#include "time.h"
//初始化结构体
typedef struct Node{
int data_1;
int data_2;
struct Node *next;
//定义一个结构体(Node)类型的指针变量,用于指向结构体节点
}Node;
//链表创建函数,用于链接节点并创建链表,n为节点长度
Node* CreatLinkList(int n)
{
//定义头,尾,链表,临时节点。
Node *head, *tail, *L,*temp = NULL;
//给头节点分配空间
head = (Node*)malloc(sizeof(Node));
//tail = head用于保存头节点信息,用于头插法清空尾节点的next
tail = head;
//随机数种子
srand(time(0));
for(int i = 0;i < n; i++)
{
if(i == 1)
temp = head;//头插法去掉空节点
L = (Node*)malloc(sizeof(Node));
L->data_1 = rand()%10 + 1;
L->data_2 = rand()%10 + 2;
//tail->next = L;尾插法
//tail = L;
L->next = head;//头插法
head = L;
}
//head = head->next;//尾插法去掉空节点
temp->next = NULL;//头插法去掉空节点
tail->next = NULL;
//返回头节点
return head;
}
//链表遍历函数,用于打印节点信息
void LinkListPrint(Node *L)
{
//当L != 0的时候循环继续
while(L)
{
printf("L->data_1 = %d\nL->data_2 = %d\n",L->data_1,L->data_2);
L = L->next;
}
}
//建立插入节点
Node* SetNode()
{
Node* new = (Node*)malloc(sizeof(Node));
new->data_1 = 11;
new->data_2 = 11;
//new->data_1 = rand()%10+10;
//new->data_2 = rand()%10+20;
//返回新生成的节点
return new;
}
//插入节点函数
//L为被插入链表,n为插入位置,new为插入节点
void InsertNode(Node* L, int n, Node *new)
{
//用于临时存放被插入节点后一节点的节点指针
Node *temp;
for(int i = 0;i < n;i++)
{
//遍历链表
L = L->next;
//遍历从0开始,n-2是new节点插入后位置为n,n-1为插入节点new为n
if(i == n-2)
{
//临时保存new节点后一节点地址信息
temp = L->next;
//new节点插入链表L
L->next = new;
//new节点接上后面的链表
new->next = temp;
}
}
}
//修改节点信息函数
void ModifyNodeData(Node *L, int n)
{
for (int i = 0;i < n; i++)
{
L = L->next;
if (i == n-2)
{
//可以加入修改函数修改
L->data_1 = 0;
L->data_2 = 0;
}
}
}
//节点删除函数,L为被操作链表,n为被删除节点
void DeleteNode(Node *L,int n)
{
Node *temp;
for(int i = 0;i < n;i++)
{
if(i == n-1)
{
//获取下一节点信息
temp = L->next;
//L->next = L->next->next;
L->next = temp->next;
//free(temp);
}
L = L->next;
}
}
//合并链表,将链表new合并到链表L
void LinkList(Node *L,Node *new)
{
//临时结构体指针变量
Node *temp = NULL;
//L != 0(NULL)时循环继续
while (L)
{
//如果L遍历到了表尾
if(L->next == NULL)
//取出表尾
temp = L;
L = L->next;
}
//表尾连上新链表
temp->next = new;
}
//翻转链表函数
Node* TurnLink(Node* L)
{
//定义节点当前,上一个,临时
Node *now,*previous,*temp;
//上一个节点 = L
previous = L;
//当前节点 = L->next
now = L->next;
//前一节点指向当前节点
previous->next = NULL;
//当前节点为空时结束循环
while (now != NULL) {
//temp暂存下一节点
temp = now->next;
//下一节点变为前一节点
now->next = previous;
//前一节点变为单曲节点
previous = now;
//下一节点变为当前节点
now = temp;
}
//返回前一节点
return previous;
}
int main()
{
Node *L,*new;
Node *NewLink = (Node*)malloc(sizeof(Node));
NewLink->data_1 = 88;
NewLink->data_2 = 88;
NewLink->next = NULL;
L = CreatLinkList(5);
printf("创建\n");
LinkListPrint(L);
new = SetNode();
printf("插入\n");
InsertNode(L, 3, new);
LinkListPrint(L);
printf("删除\n");
DeleteNode(L,4);
LinkListPrint(L);
printf("修改\n");
ModifyNodeData(L, 3);
LinkListPrint(L);
printf("链接\n");
LinkList(L, NewLink);
LinkListPrint(L);
printf("翻转\n");
LinkListPrint(TurnLink(L));
return 0;
}