C语言:【单链表】删除一个无头单链表的非尾节点

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

typedef int DataType;

typedef struct SListNode
{
    DataType data;
    struct SListNode* next; 
}SListNode;

SListNode* BuyNode( DataType x)
{
    SListNode* next = (SListNode*)malloc(sizeof(SListNode));
    next->data = x;
    next->next = NULL;
    return next;
}

void PushBack(SListNode* & ppHead, DataType x)
{
    if (ppHead == NULL)
    {
        ppHead = BuyNode(x);
    }
    else
    {
        SListNode* tail = ppHead;
        while (tail->next != NULL)
        {
            tail = tail->next;
        }
        tail->next = BuyNode(x);
    }
}

void PrintSNodeList(SListNode* ppHead)
{
    while (ppHead)
    {
        printf("%d->",ppHead->data);
        ppHead = ppHead->next;
    }
    printf("\n");
}
//删除一个无头单链表的非尾节点
void DelTail(SListNode* &ppHead, SListNode* pos)
{
    assert(ppHead);
    SListNode* del = pos;
    SListNode* cur = del->next;
    SListNode* ppHeadName = ppHead;
    while (ppHeadName != del)
    {
        ppHeadName = ppHeadName->next;
    }

    if (ppHeadName == NULL)
    {
        return;
    }
    del->data = cur->data;    
    del->next = cur->next;
    free(cur);
}

void Test2()
{
    SListNode* List = NULL;
    PushBack(List, 1);
    PushBack(List, 2);
    PushBack(List, 3);
    PushBack(List, 4);
    PushBack(List, 5);
    DelTail(List, List->next->next);
    PrintSNodeList(List);
    
    
}

int main()
{
    Test2();
    system("pause");
    return 0;
    
}
时间: 2024-12-29 01:25:18

C语言:【单链表】删除一个无头单链表的非尾节点的相关文章

删除一个无头单链表的非尾节点

void DelMidNode (Node* n) { if (n == NULL) { printf("Node is NULL\n"); } else if(n->next == NULL) { printf("n is Tail Node\n"); } else { Node* del = n->next; n->data = del->data; n->next = del->next; free(del); del =

list链表之:从链表删除一个节点list_del

从链表删除一个节点使用接口list_del,使用list_del时要非常注意. list_del的实现如下: static inline void list_del(struct list_head *entry) { __list_del(entry->prev, entry->next); entry->next = LIST_POISON1; entry->prev = LIST_POISON2; } static inline void __list_del(struct

双链表删除一个节点

写了一个删除双链表节点的程序,在这里记录一下,直接上代码,代码中的主要步骤都有注释. 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <assert.h> 5 typedef struct NODE{ 6 struct NODE *prior; 7 struct NODE *next; 8 int value; 9 }Node; 10 void print

从无头单链表中删除节点

1.从无头单链表中删除节点 一个没有头指针的单链表.一个指针指向此单链表中间的一个节点(不是第一个也不是最后一个节点).将该节点删除. A-->B-->C-->D       =====>     A-->C-->D 问题解析:由于只能单向遍历,故与删除B节点,无法得知B的前驱A,即无法像普通删除中那样让A的next指向C; 这里有个技巧,将C当做B,而B复制成C,则删除C节点即可: 2.给定一个链表的头指针,要求只遍历一次,将单链表中的元素顺序反转过来. A-->

Angular11 模板表单、相应式表单

1 模板表单 1.1 指令 NgForm NgForm指令会为表单元素创建一个表单控件对象FormControl的集合,用来存放标有NgModel指令的表单对象 NgModel 绑定了NgModel指令的表单控件会根据该表单控件的name属性来为来创建一个FormControl对象,并存放到FormControl的集合中 NgModelGroup 多个表单对象组成的一个FormControl的集合 代码截图 效果截图

将两个有序链表合并成一个有序链表

问题定义: 写一个函数SortedMerge函数,该函数有两个参数,都是递增的链表,函数的功能就是合并这两个递增的链表为一个递增的链表,SortedMerge的返回值是新的链表.新链表由前两个链表按元素递增顺序合并而成,也就是说它不会创建新的元素. 比如:这里有两个链表,分别是 list1: 5->10->15 list2: 2->3->20 SortedMerge函数返回一个指向新链表的指针,新链表应该是如下这样的:2->3->5->10->15->

编程之美:从无头单链表中删除节点,讨论

1.问题描述 假设有一个没有头指针的单链表.一个指针指向此单链表中间的一个节点(不是第一个,也不是最后一个),请将该节点从单链表中删除. 如下图所示: 这种情况大家都知道,将下一个节点的data和next拷贝到当前节点,并将当前节点的next设置为下下个节点,然后释放下一个节点所占内存(free), 如果红字条件去掉: 还用上面的方法就有问题,一般上面方法的代码如下: void DeleteRandomNode(Node* pCurrent) { if(pCurrent == NULL) ret

单链表删除节点

单链表删除节点 node *del(node *head, int num) { node *p1, *p2; p1 = head; while (num != p1->data && p1->next != NULL) { p2 = p1; p1 = p1->next; } if (num == p1->data) { if (p1 == head) head = p1->next; else p2->next = p1->next; free(

Python与数据结构[0] -&gt; 链表[0] -&gt; 单链表与带表头单链表的 Python 实现

单链表 / Linked List 目录 单链表 带表头单链表 链表是一种基本的线性数据结构,在C语言中,这种数据结构通过指针实现,由于存储空间不要求连续性,因此插入和删除操作将变得十分快速.下面将利用Python来完成单链表的实现. 1 单链表 不带表头的单链表通常形式如下, node_1 -> node_2 -> node_3 -> node_4 完整代码 1 class Node: 2 def __init__(self, val=None, nxt=None): 3 self.v