实现单向链表节点删除

原创 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;
}

运行结果示例如下:





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

删除单向链表中的某一个节点

已知一个单向链表的表头head,写出一个删除某一个节点的算法,要求先找到此节点,然后删除。 #include using namespace std; typedef struct node ...
  • huahuahailang
  • huahuahailang
  • 2013年04月05日 22:33
  • 44607

java实现单向链表的增、删、改、查

单向链表 作者:vashon package com.ywx.link; /** * 单向链表 * @author vashon * */ public class LinkTest { ...
  • yangwenxue_admin
  • yangwenxue_admin
  • 2015年05月09日 14:39
  • 3041

删除单链表中的重复节点(删除多余项)

题目:如何删除单链表中的重复节点(即保证每个元素只出现一次,删除多余的,且后来出现的元素)。 一个没有排序的单链表,如 list = {a, 1, x, b, e, f, f, e, a, g, h...
  • cyuyanenen
  • cyuyanenen
  • 2016年06月20日 13:46
  • 9290

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

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

利用二级指针删除单向链表节点

// testPPointer.cpp : Defines the entry point for the console application. // #include "stdafx.h" #...
  • chollima
  • chollima
  • 2013年10月28日 23:17
  • 1596

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

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

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

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

剑指Offer 面试题18:删除链表节点 Java代码实现

题目:在O(1)时间内删除链表节点。 给定单向链表头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点。 这儿采用有头结点的单链表结构,头结点的存在是为了方便操作,针对单链表来说,如果带头...
  • hh_zheng
  • hh_zheng
  • 2017年11月16日 22:08
  • 41

C语言实现链表节点的插入和删除

http://www.cnblogs.com/scrat/archive/2012/08/17/2644086.html 今天我实现的是插入链表节点和删除链表节点。 看代码吧,...
  • jeffasd
  • jeffasd
  • 2016年06月07日 11:09
  • 873

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

我在之前一篇博客《C语言实现单链表节点的删除(不带头结点)》中详细实现了如何在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表。代码示例上传至 https://github...
  • CHENYUFENG1991
  • CHENYUFENG1991
  • 2016年03月01日 16:09
  • 3443
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:实现单向链表节点删除
举报原因:
原因补充:

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