数据结构-单链表

c 复制代码
#include<stdio.h>
#include<stdlib.h>

typedef struct Node
{
    int data;
    struct Node* next;
}Node;

//创建一个头结点,数据域保存链表节点数
Node* init_single_list()
{
    Node* node = (Node*)malloc(sizeof(Node));
    node->next = NULL;
    node->data = 0; //初始化时,链表节点数为0
    return node;
}

//头插法
static int insert_from_head(Node* head,int data)
{
    if(!head)
        return -1;
    Node* tmp_node = (Node*)malloc(sizeof(Node));
    tmp_node->data = data;
    tmp_node->next = head->next;
    head->next = tmp_node;
    head->data++;
    printf("data of list is: %d\n",head->data);
    return 0;
}
//尾插法
static int insert_from_tail(Node* head,int data)
{
    if(!head)
        return -1;
    
    Node* node = (Node*)malloc(sizeof(Node));
    Node* tmp_node = head;

    node->data = data;
    node->next = NULL;
    if (NULL == tmp_node->next)//链表初始化后首次插入
    {
        tmp_node->next = node;
        printf("in hear\n");
        head->data++;
        printf("head -> data in 1 = %d\n",head -> data);
        return 0;
    }
       
    tmp_node = tmp_node->next;
    while(tmp_node->next)
    {
        tmp_node = tmp_node->next;
    }
    tmp_node->next = node;
    head->data++;
    printf("head -> data in 2 = %d\n",head -> data);
    return 0;

}

/*
另一种尾插法的写法
void tailInsert(Node* L, int data) 
{
    Node* node = L;
    Node* node1 = node;

    for(int i = 0; i < L -> data; i++) {
        node = node->next;
    }
    Node* n = (Node*)malloc(sizeof(Node));
    n -> data = data;
    n -> next = NULL;
    node -> next = n;
    L -> data ++;
    printf("L -> data = %d\n",L -> data);
    printf("node1 -> data = %d\n",node1 -> data);
    printf("node -> data = %d\n",node -> data );
}
*/

//打印链表
static int print_single_list(Node* head)
{
    if((!head->next) && (!head))
        return -1;

    Node* tmp_node = head->next;
    while(tmp_node)
    {
        printf("%d ",tmp_node->data);
        tmp_node = tmp_node->next;
    }
    putchar('\n');
    return 0;
}

//删除链表中的某个节点
static int delete_node(Node* head,int data)
{
    if((!head->next) && (!head))
        return -1;

    Node* node = head;
    Node* tmp_node = node->next;
    while(tmp_node)
    {
        if (tmp_node->data == data)
        {
            node->next = tmp_node->next;
            free(tmp_node);
            printf("head->data start is %d\n",head->data);
            head->data--;
            printf("head->data end-- is %d\n",head->data);
            return 0;
        }
        node = tmp_node;
        tmp_node = tmp_node->next;
    }
    return -1;
    
}

/*
有问题的写法(free有问题)
static int delete_node_1(Node* head,int data)
{
    if((!head->next) && (!head))
        return -1;

    Node* tmp_node = head;
    Node* node = tmp_node;
    //Node* tmp_node = node->next;
    while(node->next)
    {
        if (node->next->data == data)
        {
            tmp_node->next = node->next->next;
            //free(tmp_node->next);   //直接free会发生错误
            printf("head->data is %d\n",head->data);
            head->data--;
            printf("head->data is %d\n",head->data);
            return 0;
        }
        tmp_node = node;
        node->next = node->next->next;
    }
    return -1;    
}*/

//指定在某个节点后面加入新节点
static int insert_from_node_tail(Node* head,int num,int data)
{
    if((!head->next) && (!head))
        return -1;

    Node* tmp_node = head;
    Node* node = (Node*)malloc(sizeof(Node));
    node->data = data;
    while (tmp_node->next)
    {
        if (tmp_node->next->data == num)
        {
            node->next = tmp_node->next->next;
            tmp_node->next->next = node;
            head->data++;
            printf("insert_from_node_tail ok\n");
            return 0;
        }
        tmp_node = tmp_node->next;
    }
    return -1;
}
//指定在某个节点前面加入新节点
static int insert_from_node_head(Node* head,int num,int data)
{
    if((!head->next) && (!head))
        return -1;

    Node* tmp_node = head;
    Node* node = (Node*)malloc(sizeof(Node));
    node->data = data;
    while (tmp_node->next)
    {
        if (tmp_node->next->data == num)
        {
            node->next = tmp_node->next;
            tmp_node->next = node;
            head->data++;
            printf("insert_from_node_head ok\n");
            return 0;
        }
        tmp_node = tmp_node->next;
    }
    return -1;
}
int main()
{
    Node* head = init_single_list();
    //Node* head_1 = init_single_list(head,12);
    int list_d;
    int insert_value;
    //insert_from_head(head,12);
    printf("please input data to insert the list and how many you want to insert\n");
    scanf("%d",&list_d);
    printf("list_d is %d\n",list_d);

    for (int i = 1; i <= list_d ; i++)
    {
        printf("please input insert_value %d:\n",i);
        scanf("%d",&insert_value);
        //insert_from_head(head,insert_value);
        insert_from_tail(head,insert_value);
        //tailInsert(head,insert_value);
        printf("insert_value is %d\n",insert_value);
    }
    
    //insert_from_head(head,12);
    print_single_list(head);
    printf("in main_1 head->data is %d\n",head->data);
    insert_from_node_tail(head,12,55555);
    print_single_list(head);
    printf("in main_2 head->data is %d\n",head->data);

    insert_from_node_head(head,55555,6666);
    print_single_list(head);
    printf("in main_3 head->data is %d\n",head->data);

    int ret = delete_node(head,12);
    if(-1 == ret)
        printf("the data is not in the list\n");
    else
        print_single_list(head);
    
    return 0;
}
相关推荐
liang_jy1 小时前
数组(Array)
数据结构·面试·trae
要做朋鱼燕2 小时前
【数据结构】用堆解决TOPK问题
数据结构·算法
秋难降3 小时前
LRU缓存算法(最近最少使用算法)——工业界缓存淘汰策略的 “默认选择”
数据结构·python·算法
Jayyih5 小时前
嵌入式系统学习Day19(数据结构)
数据结构·学习
DdduZe6 小时前
8.19作业
数据结构·算法
PyHaVolask6 小时前
链表基本运算详解:查找、插入、删除及特殊链表
数据结构·算法·链表
1白天的黑夜17 小时前
链表-2.两数相加-力扣(LeetCode)
数据结构·leetcode·链表
花开富贵ii7 小时前
代码随想录算法训练营四十六天|图论part04
java·数据结构·算法·图论
熬了夜的程序员7 小时前
【LeetCode】16. 最接近的三数之和
数据结构·算法·leetcode·职场和发展·深度优先
Miraitowa_cheems7 小时前
LeetCode算法日记 - Day 15: 和为 K 的子数组、和可被 K 整除的子数组
java·数据结构·算法·leetcode·职场和发展·哈希算法