单链表双指针实现

单链表的实现思想和双指针的应用方法在前面博客中都已阐述,在本文将实现双指针实现单链表的初始化,插入,删除,打印。
【测试代码1】

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

typedef  struct Node{
    int data;
    struct Node *next;
}node_t;

//创建头结点
node_t * create()
{
    node_t *head = (node_t *)malloc(sizeof(node_t));
    head->next = NULL;

    return head;
}
void insert(node_t **list, int data)
{
    node_t *pnode = (node_t *)malloc(sizeof(pnode));
    pnode->data = data;
    pnode->next = NULL;

    if(*list == NULL)
    {
        *list = pnode;
    }
    else
    { 
        node_t *p =*list;
        while(p->next != NULL)
        {
            p = p->next;
        }
        p->next = pnode;
    }
}

void remove(node_t **list, int data)
{
    node_t *p =( *list);

    if(p ->next== NULL)
        return ;
    while(p->next->data != data)
        p = p->next;
    if(p->next == NULL)
        printf("no data");
    if (p->next->data == data)
        p->next = p->next->next;

}

void print(node_t **list)
{

    node_t *p = (*list)->next;

    if(!p)
        return;
    while(p != NULL)
    {
        printf("%d ",p->data);
        p = p->next;
    }

}
void main()
{

    node_t *head;//链表头结点
    node_t **list;//链表头指针
    head = create();
    list =& head;//令链表头指针指向头结点
    insert(list,1);
    insert(list,2);
    insert(list,3);
    insert(list,4);
    insert(list,5);
    insert(list,6);
    printf("after insert data, the list data is:\n");
    print(list);
    printf("\n");
    printf("remove data 6, the list data is:\n");
    remove(list,6);
    print(list);
}

【输出结果】
这里写图片描述
这里采用尾部插入,所以头指针始终指向头结点,双指针的用处就是你可以改变其头结点后面的内容,而不会改变头指针的位置,如果是前部插入的话,需要不断变化头结点的位置,程序会有所区别。
【测试代码2】

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

typedef  struct Node{
    int data;
    struct Node *next;
}node_t;

//使得头指针指向头结点
node_t * create()
{
    node_t *head = (node_t *)malloc(sizeof(node_t));
    head->next = NULL;

    return head;
}
void insert_front(node_t **list, int data)
{
    node_t *pnode = (node_t *)malloc(sizeof(pnode));
    pnode->data = data;
    pnode->next = (*list)->next;
    (*list)->next = pnode;
}

void remove(node_t **list, int data)
{
    node_t *p =( *list);

    if(p ->next== NULL)
        return ;
    while(p->next->data != data)
        p = p->next;
    if(p->next == NULL)
        printf("no data");
    if (p->next->data == data)
        p->next = p->next->next;

}

void print(node_t **list)
{

    node_t *p = (*list)->next;

    if(!p)
        return;
    while(p != NULL)
    {
        printf("%d ",p->data);
        p = p->next;
    }

}
void main()
{

    node_t *head;
    node_t **list;
    head = create();
    list =& head;
    insert_front(list,1);
    insert_front(list,2);
    insert_front(list,3);
    insert_front(list,4);
    insert_front(list,5);
    insert_front(list,6);
    printf("after insert data, the list data is:\n");
    print(list);
    printf("\n");
    printf("remove data 6, the list data is:\n");
    remove(list,6);
    print(list);
}

【输出结果】
这里写图片描述
删除单链表过程可以用另一种方式代替,代码如下:

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

typedef  struct Node{
    int data;
    struct Node *next;
}node_t;

//创建头结点
node_t * create()
{
    node_t *head = (node_t *)malloc(sizeof(node_t));
    head->next = NULL;

    return head;
}
void insert(node_t **list, int data)
{
    node_t *pnode = (node_t *)malloc(sizeof(pnode));
    pnode->data = data;
    pnode->next = NULL;

    if(*list == NULL)
    {
        *list = pnode;
    }
    else
    { 
        node_t *p =*list;
        while(p->next != NULL)
        {
            p = p->next;
        }
        p->next = pnode;
    }
}

node_t * finddeleted(node_t **list, int data)
{
    node_t *pdeleted = (node_t *)malloc(sizeof(node_t));
    pdeleted->data = data;

    if(!list)
        return NULL;
    node_t *pnext = (*list);
    while(pnext->next->data != pdeleted->data)
        pnext = pnext->next;
    return pnext->next;
}
void remove(node_t **list, node_t *ptoDeleted)
{
    if(!list || !ptoDeleted)
        return;
    //要删除的结点不是尾结点
    if(ptoDeleted ->next != NULL)
    {
        node_t *pnext = ptoDeleted->next;
        ptoDeleted->data = pnext->data;
        ptoDeleted->next = pnext->next;

        //free(pnext);
        pnext = NULL;
    }
    //链表只有一个结点,删除头节点
    else if(*list == ptoDeleted)
    {
    //  free(ptoDeleted);
        ptoDeleted = NULL;
        *list = NULL;
    }
    //链表中有多个结点,删除尾结点
    else
    {
        node_t *pnode = *list;
        while(pnode->next != ptoDeleted)
        {
            pnode = pnode->next;
        }
        pnode->next = NULL;
        //free(ptoDeleted);
        ptoDeleted = NULL;
    }

}

void print(node_t **list)
{

    node_t *p = (*list)->next;

    if(!p)
        return;
    while(p != NULL)
    {
        printf("%d ",p->data);
        p = p->next;
    }

}
void main()
{

    node_t *head;//链表头结点
    node_t **list;//链表头指针
    head = create();
    list =& head;//令链表头指针指向头结点
    insert(list,1);
    insert(list,2);
    insert(list,3);
    insert(list,4);
    insert(list,5);
    insert(list,6);
    printf("after insert data, the list data is:\n");
    print(list);
    printf("\n");
    printf("remove data 6, the list data is:\n");
    node_t *p = finddeleted(list, 3);
    remove(list,p);
    print(list);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值