单链表 c语言

不一定对,仅供参考

在单链表中开始理解错误的地方

这两个并不等价,前者用于后移,后者会破坏链表结构

list = list->next;    list->next = list->next->next; 

#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
    int data;
    struct Node* next;
}Node;
// 初始化,创建头结点返回
Node* list_init()
{
    Node* list = (Node*)malloc(sizeof(Node));
    list->next = NULL;
    list->data = 0;

    return list;
}
// 头插法
int head_insert(Node* list,int data)
{
     Node* node = (Node*)malloc(sizeof(Node));
     node->next = NULL;
     node->data = data;
     node->next = list->next;// 连接后面结点
     list->next = node; // 头后添加
     list->data++; // 记录个数
     return 0;
}
// 尾插法
int tail_insert(Node* list,int data)
{
    Node* node = (Node*)malloc(sizeof(Node));
    node->next = NULL;
    node->data = data;

    Node* head = list;
    while(list->next != NULL)
    {
        list = list->next;//list->next = list->next->next; //改变list,注释方法错误
    }
    node->next = list->next;
    list->next = node;
    list->next->data = data;
    list = head;
    head->data++;
    return 0;
}
int delete_node(Node* list,int data)
{
    if(list == NULL || list->next == NULL) return -1;
    Node* pre = list;
    Node* current = list->next;
    while(current != NULL)
    {
        if(current->data == data)
        {
            pre->next = current->next;
            list->data--;
            free(current);
            return 0;
        }
        pre = current;
        current = current->next; 
    }
    return -1;
    
}
void printf_list(Node* list)
{
    Node* current = list;
    while(current->next != NULL)
    {
        printf("%d\t",current->next->data);
        current = current->next;
        
    }
    printf("\n");
    printf("num:%d\n",list->data);
}
void free_list(Node* list)
{
    while(list != NULL)
    {
        Node* current = list;
        list = list->next;
        free(current);
    }
}
int main(int argc, char const *argv[])
{
    Node* list = list_init();
    tail_insert(list,3);
    tail_insert(list,4);
    tail_insert(list,5);
    tail_insert(list,6);
    tail_insert(list,7);
    delete_node(list,4);
    printf_list(list);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值