【C语言】带头节点的链表的增删改查示例

#include<stdio.h>
#include <stdlib.h>
typedef struct node
{
    int data;
    struct node *next;
}NODE;

NODE * creat_List_head();
int list_add_item(NODE *list, int data);
int list_delete_item(NODE *list,int num);
int list_update_item(NODE*list,int num,int new_data);
void show_list(NODE* list);
NODE *creat_List_head()
{
    NODE* head = NULL;
    NODE* Pnew = NULL;
    head = (NODE *)malloc(sizeof(NODE));    
    if(NULL == head)
    {
        return NULL;
    }
    head->next = NULL;

    Pnew = (NODE *)malloc(sizeof(NODE));
    if(NULL == Pnew)
    {
        return NULL;
    }
    Pnew->data = 100;
    Pnew->next = NULL;
    head->next = Pnew;
    head = Pnew;

    return head;
}
int list_add_item(NODE *list, int data)
{
    NODE *tail = list;
    NODE* new_node = NULL;
    new_node = (NODE *)malloc(sizeof(NODE));    
    if(NULL == new_node)
    {
        return -1;
    }

    new_node->data = data;
    //带头结点的尾插法
    while(tail)
    {
        if(NULL == tail->next)
        {
            new_node->next = tail->next;
            tail->next = new_node;
            tail = new_node;
            printf("add %d\n",tail->data);
            return 1;
        }
        tail = tail->next;
    }

    return 0;
}
//删除第num个节点
int list_delete_item(NODE *list,int num)
{
    int i = 1;
    int list_length = 0;
    NODE*head = list;
    NODE*delete_node = list->next;
    if(num == 0)
        return -1;
    
    while(head){
        if(head->next == NULL)
        {
            printf("not find %d\n",num);
            return -1;
        }

        if(i == num)
        {
            head->next = delete_node->next;
            printf("free node %d\n",num);
            delete_node->next = NULL;
            free(delete_node);
            return 0;
        }
        i++;
        head = head->next;
        delete_node = delete_node->next;
    }
    return 0;
}
//修改某个节点的某个值
int list_update_item(NODE*list,int num,int new_data)
{
    NODE*head = list;
    int i = 1;
    while(head)
    {
        if(num == i )
        {
            head->data = new_data;
            return 0;
        }
        i++;
        head = head->next;
    }
    return 0;
}
void show_list(NODE* list)
{
    NODE*head = NULL;
    printf("show all list node :");
    for(head=list;head !=NULL;head = head->next )
    {
        printf("%d ",head->data);
    }
    printf("\n");
}


int main()
{
    NODE *list = NULL;
    list = creat_List_head();
    list_add_item(list,1);
    list_add_item(list,2);
    list_add_item(list,3);
    list_delete_item(list,9);
    list_add_item(list,4);
    list_delete_item(list,3);
    list_add_item(list,5);
    list_update_item(list,4,999);
    list_add_item(list,6);
    show_list(list);
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值