数据结构-单链表

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;
}
相关推荐
冠位观测者1 小时前
【Leetcode 每日一题】2176. 统计数组中相等且可以被整除的数对
数据结构·算法·leetcode
飞天狗1112 小时前
数据结构——二叉树
数据结构·算法
巴巴_羊4 小时前
Layout 路由
数据结构
柯ran5 小时前
数据结构|排序算法(三)选择排序 堆排序 归并排序
数据结构·算法·排序算法
无敌的牛5 小时前
滑动窗口209. 长度最小的子数组
数据结构·算法
挽天java6 小时前
数据结构习题--岛屿数量
数据结构
别来无恙2026 小时前
数据结构(6)
c语言·数据结构
泽02027 小时前
循环队列的实现
数据结构
PHASELESS4118 小时前
Java排序算法百科全书:原理、实现与实战指南
java·数据结构·算法·排序算法
学习编程的gas8 小时前
数据结构——八大排序算法
数据结构·算法·排序算法