实现单向链表节点删除

原创 2016年06月01日 21:39:49

本文将介绍单向链表的建立,遍历,删除操作。

首先是结构体定义:

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

typedef struct Integer{
        int num;
        struct Integer *next;
}Node, *Linklist;

单向链表的创建如下(不带头节点):

Node* create_list(const int n)
{
        Linklist head,p1,p2;

        head = NULL;
        printf("Please input the element\n");

        for(int i=0; i<n; ++i){
                p1 = (Linklist)malloc(sizeof(Node));
                scanf("%d",&p1->num);

                if(head == NULL)     //Without the lead node 
                        head = p1;
                else
                        p2->next = p1;
                p2 = p1;
        }
        p1->next = NULL;
        return head;
}

遍历操作如下:

void print_list(Linklist p)
{
        while(p){
                printf("%d ",p->num);
                p = p->next;
        }
        printf("\n");
}

下面是删除操作,通过两个节点遍历链表,节点p2负责找到对应元素,然后将p2的前驱结点p1指向p2的后继节点p2->next,相当于删除了p2,并释放p2所占用的内存,防止内存泄漏。

void delete_list(Linklist head, int key)
{
        Linklist p1,p2;
        p1 = head;
        p2 = NULL;
        if(p1){
                if(p1->num == key){      //If to delete the firest node.
                        head = head->next;
                        free(p1);
                        print_list(head);
                }
                else{
                        for(p1=head,p2=p1->next; p2!=NULL,p2->num!=key; p1=p1->next,p2=p2->next);  //Using two nodes to traverse the list,until to find the element to be deleted.
                        if(p2 != 0){
                                p1->next = p2->next;
                                free(p2);
                                print_list(head);
                        }
                }
        }
}

主函数部分如下:

int main(int argc, char* argv[])
{
        int n,key;
        Linklist q = NULL;

        printf("Please the number of node you want to create:\n");
        scanf("%d",&n);

        q = create_list(n);
        print_list(q);

        printf("Please input the number you want to delete:\n");
        scanf("%d",&key);
        delete_list(q,key);

        return 0;
}

运行结果示例如下:





版权声明:本文为博主原创文章,转载请注明出处,谢谢。

相关文章推荐

关于c语言中删除单向链表节点的问题

二话不说先上代码,这是摘自网上的一段代码,用以解读题目所说的问题。// 假设h为指向链表头结点指针,那么head就是指向h指针的指针 void delete(node ** head) { f...

算法面试:单向链表节点的奇偶排序。

给定一个单项链表,要求实现一个算法,把链表分成两部分,前一部分全是下标为偶数的节点,后一部分全是下标为奇数的节点。不能分配新的内存空间,在操作队列时,不可更改节点内容,只能更改节点的next指针。

C语言实现单链表节点的删除(带头结点)

我在之前一篇博客《C语言实现单链表节点的删除(不带头结点)》中详细实现了如何在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表。代码示例上传至 https://github...

C++实现删除单链表节点的功能(源代码+截图)

删除链表中的一个节点。其主要思想就是改变链表的指针域,以此到达删除节点的目的。

C语言实现单链表节点的删除(不带头结点)

对链表节点进行增删改查是最基本的操作,这篇博客将会来实现对节点的删除。其他的操作可参考《C语言实现链表的基本操作》这篇博客。删除某个节点有两个类型:(1)删除i某个位置的节点;(2)判断x值是否在链表...

算法习题59,60:不能被继承的类,O(1)时间复杂度删除链表节点

(1).不能被继承的类。 题目:用 C++设计一个不能被继承的类。 分析:这是 Adobe 公司 2007 年校园招聘的最新笔试题。 这道题除了考察应聘者的 C++基本功底外,还能考察反应能力,是一道...
  • ylf13
  • ylf13
  • 2013-11-11 11:18
  • 757

Lintcode 在O(1)时间复杂度删除链表节点

1.描述 给定一个单链表中的一个等待被删除的节点(非表头或表尾)。请在在O(1)时间复杂度删除该链表节点。 样例 给定 1->2->3->4,和节点 3,删除 3 之后,链表应该变为 1-...

在o(1)时间删除链表节点

在o(1)时间删除链表节点剑指offer 面试题13 : 在o(1)时间删除链表节点 给定单向链表的头指针和一个节点指针,定义一个函数在o(1)时间删除该节点。 代码如下: 这里先使...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)