C语言单链表的增删查改合并翻转

欢迎交流与讨论。

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值