带头结点的链表的增、删、查、插

#include <stdio.h>
#include <stdlib.h>

/*
 *带头结点的单链表
 * 
 * */

struct node
{
    int num;
    char name;
    int age;

    struct node *next;
};

typedef struct node Hnode;
typedef Hnode * Hlink;

//创建新节点
void create_new_node(Hlink *new_node)
{
    *new_node = (Hlink)malloc(sizeof(Hnode));
}

//创建链表
void create_Hlink(Hlink *head)
{
    create_new_node(head);
    (*head)->next = NULL;
}

//插入链表-头插法
void insert_node_head(Hlink head, Hlink new_node)
{
    new_node->next = head->next;
    head->next = new_node;
}

//中间插入法
void insert_node_mid(Hlink head, Hlink new_node, int loc, int num)
{
    Hlink p = NULL;
    int count = 1;   //计数
    
    p = head->next;

    if(p == NULL)
    {
        head->next = new_node;
        new_node->next = NULL;
        
    }
    else
    {
        while(p != NULL && count != loc)
        {
            p =  p->next;
            count++;
        }

        if( p != NULL)
        {   new_node->num = num;
            new_node->next = p->next;
            p->next = new_node;
        }
        else
        {
            printf("error local to insert!");
        }
    }

    
}
//尾插法
void insert_node_tail(Hlink head, Hlink new_node)
{
    Hlink p = NULL;

    p = head;

    while(p->next != NULL)
    {
        p = p->next;
    }

    p->next = new_node;
    new_node->next = NULL;

}

//列出链表
void display_Hlink(Hlink head)
{
    Hlink p = NULL;
    
    if(head == NULL)
    {
        printf("no this link\n");
    }
    else if(head->next == NULL)
    {
        printf("link is null\n");
    }
    else
    {
        p = head->next;

        while(p != NULL)
        { 
            printf("%d\n",p->num);
            p = p->next;
        }
    }
}

//释放空间-头结点留着
void clear_Hlink(Hlink head)
{
    Hlink p = NULL;

    p = head->next;

    while(p != NULL)
    {
        head->next = p->next;
        free(p);
        p = head->next; 
    }   
    
}

//全部释放
void release_Hlink(Hlink *head)
{
    clear_Hlink(*head);
    free(*head);
    *head = NULL;

    printf("空间全部释放!\n");
}

//查找结点
void seek_node(Hlink head, int n)
{
    Hlink p = NULL;
    int count = 1;
   
    p = head->next;
    
    while(p != NULL && count != n)
    {
        p = p->next;
        count++;
    }
    
    if(p != NULL)
    {
        printf("第 %d 位的结点值是:%d\n ", n , p->num);
    }
    else
    {
        printf("no this node!\n");
    }
    
}

//删除结点
void delete_node(Hlink head, int delete_node_loc)
{
    Hlink p = NULL;
    Hlink q = NULL;
   
    q = head;
    p = head;

    int count = 0;
    int sum = 0;

    while(p != NULL)
    {
        p = p->next;
        sum++;
    }
    
    p = head;

    if(p == NULL)
    {
        printf("Link is empty!");
    }
    else if(delete_node_loc > sum)
    {
        printf("no this node!");
    }
    else
    {
        p = head;
        while(p != NULL && count != delete_node_loc)
        {   
            q = p;
            p = p->next;
            count++;    
        }

        if(p != NULL)
        {
            q->next = p->next;
            free(p);
        }
        else
        {
            printf("no this node!");
        }
    }
}


int main(int argc, char **argv)
{
    //创建结点模型,定义结构体和结构体指针
                            
    Hlink head = NULL;      //定义头指针
    Hlink new_node = NULL;  //定义一个指针用于指向结点
    int i;                  
    int loc;      //中间插入位置
    int num;      //中间插入的值
    int n;        //查找第几个结点
    int delete_node_loc;   //删除第几个结点

    //创建链表
    create_Hlink(&head);

    //插入链表
    printf("插入结点\n");

    for(i = 0; i < 10; i++)
    {
        create_new_node(&new_node);
        new_node->num = i + 1;
       // insert_node_head(head, new_node);   //头插函数
        insert_node_tail(head, new_node);     //尾插函数
    }
    
  /*  //中间插入
    printf("请输入要插入的位置:\n");
    scanf("%d",&loc);
    printf("请输入要插入的数:\n");
    scanf("%d",&num);
    create_new_node(&new_node);
    insert_node_mid(head, new_node, loc, num);    //中间插入函数
   */

    //输出链表
    display_Hlink(head);

    /*//查找结点
    printf("请输入需要查找第几个结点:\n");
    scanf("%d",&n);
    seek_node(head, n);
*/
    //删除结点
    printf("请输入要删除第几个结点:\n");
    scanf("%d",&delete_node_loc);
    delete_node(head, delete_node_loc);
    display_Hlink(head);

    //释放空间
    clear_Hlink(head);   //清除除头结点外所有结点
    display_Hlink(head);

    release_Hlink(&head); //释放所有结点(包括头结点)
    display_Hlink(head);

    return 0;
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值