数据结构中链表的前插

#include<stdio.h>
#include<stdlib.h>
struct node //前插
{
    int num;

    struct node * next;
};

typedef struct node Node;
typedef struct node * Link;

void create_link(Link * head)
{
    *head = NULL;
}

void create_node(Link * new_node)
{
    *new_node = (Link)malloc(sizeof(Node));
}

void insert_node_tail(Link * head,Link new_node)
{
    Link p;
    p = *head;
    if(NULL==*head)
    {
        *head=new_node;
        new_node->next=NULL;
    }
    else
    {
        while(p->next !=NULL)
    {
        p=p->next;
    }
    p->next=new_node;
    new_node->next=NULL;
    }
}

void insert_node_mid_front(Link * head,Link new_node,int loc)
{
    Link p;
    Link q;
    p=NULL;//总是被忽略
    q=NULL;
    q = *head;
    p = *head;//若p=(*head)->next,那么少头结点的判断
    if(NULL==*head)//p
    {
        *head = new_node;
        new_node->next = NULL;
    }
    else
    {
        while(p !=NULL && p->num != loc)//->next特别重要
        {
            q=p;
            // q->next=p;//严重错误不是指向,是位置改变
            p = p->next;//一定要理解这个写法
        }
        if(p == *head)
        {
            new_node->next = p;
            *head=new_node;
        }
        else
        {
            new_node->next=p;
            q->next = new_node;
        }
    }
}

void display_link(Link head)
{
    Link p=NULL;
    p = head;
    if(NULL==p)
    {
        printf("Link is Empty!\n");
        return;       //这句不能少!!!流程返回,值不返回。
    }
    while(p != NULL)
    {
        printf("%5d",p->num);//与printf("%5d\n",p->num);不同
        p = p->next;
    }
    printf("\n");
}

void release_link(Link * head)
{
    Link p=NULL;      //先赋值啊!!!
    p=*head;
    while(*head!=NULL)    //这里不能写p,p被释放
    {
        p=*head;
        *head=(*head)->next;
        free(p);
    }
}

int main()
{
    Link head=NULL;
    Link new_node=NULL;
   
   
    int i,loc;
    create_link(&head);
    for(i=0;i<10;i++)
    {
        create_node(&new_node);
        new_node->num=i+1;

        insert_node_tail(&head,new_node);
    }
    create_node(&new_node);//
    display_link(head);
    printf("Input loc:");
    scanf("%d",&loc);
    printf("Input new_node->num:");
    scanf("%d",&new_node->num);//搞忘了,num是int型

    insert_node_mid_front(&head,new_node,loc);//整理与上面new的关系
   
    create_node(&new_node);//
    display_link(head);
    

    release_link(&head);
    
    create_node(&new_node);//
    display_link(head);
    

    return 0;      //这句不能少!!!
}

输出结果:

judy@judy-virtual-machine:~/桌面/ft$ ./yx4
    1    2    3    4    5    6    7    8    9   10
Input loc:7
Input new_node->num:4
    1    2    3    4    5    6    4    7    8    9   10
Link is Empty!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值