【领卓教育】数据结构/C 单链表顺序插入 与按值删除

先定义一个结构体,并创建一个空的带头单链表!

typedef struct node
{
    int data;
    struct node * next;
}link_list;

link_list * creat_malloc()  //返回一个指针
{
    link_list *p ;
    p = malloc(sizeof(*p));
    if(p == NULL)
        return NULL;

    p->next = NULL;
    return p;   
}

顺序插入结点需要将你要插入的结点 与  链表中的值进行比较!

int list_order_insert(link_list *me,int *data)       //顺序插入
{
    link_list *p = me,*q;
    while(p->next && p->next->data < *data )     //p->next 表示p->next不为空
    {                                            //*data是你要插入的值
        p = p->next;                          //你要插入的值大于当前结点,就与下一个结点比较
                                               //当前结点的值要是大于*data,就跳出循环
    }
    q = malloc(sizeof(*q));                 //为你插入的结点申请内存空间,并用q指向它
    if(q == NULL)                            //如果申请失败,返回-1
        return -1;

    q->data = *data;                          //将参数*data 赋给q->data
    q->next = p->next;                        //q这两句是插入的基本语句
    p ->next = q;
    return 0;
}

单链表的删除,按照传的参数进行删除:

int delete(link_list *me,int *value)     //删除一个节点的函数
{    
    link_list *p = me;                   //p开始指向头结点
    link_list *q =NULL;
    while(p->next  && p->next->data != *value )//判断p的下一个节点的值
        p = p->next;           //如果p的下一个结点不满足条件,p就往后移
           
    if(p->next == NULL)        //如果p的下一个结点为空,表示没有找到,返回-1
        return -1;
    else                        //如果找到了,就执行下面的语句
    {
        q = p->next;                //找到以后,用q指向p的下一个结点
        p->next = q->next;          //p->next指向了q->next,跳过了q
        free(q);                    //释放掉q
        q = NULL;                   //将q赋为空
    }
}

下面是主函数:

int main()
{
    int i;
    link_list *p;
    int arr[] = {12,9,3,34,5,45,6};
    p=creat_malloc();
    printf("hello1\n");
    for(i = 0;i<sizeof(arr)/sizeof(*arr);i++)
    {
        list_order_insert(p,&arr[i]);
    }
    printf("hello\n");
    show(p);
    int value = 9;
    delete(p,&value);
    show(p);
}

结果如下:

猜你喜欢

转载自blog.csdn.net/qq_40876689/article/details/83690442