16 把第 i 个结点从链表中删除

这里先删除第2个结点,测试 deleNode 函数

 1 /*把第i个结点从链表中删除*/
 2
 3
 4 #include<stdio.h>
 5 #include<stdlib.h>
 6
 7 //链表中节点的结构
 8 typedef struct Link {
 9     int  data;
10     struct Link* next;
11 }link;
12
13 //链表初始化
14 link* initByTailInsert() {
15     link* phead = NULL;//创建头指针
16     link* first_node = (link*)malloc(sizeof(link));//创建第一个节点
17     //第一个结点先初始化
18     first_node->data = 1;
19     first_node->next = NULL;
20     phead = first_node;//头指针指向第一个节点
21
22     //尾插入赋值
23     for (int i = 2; i < 5; i++) {
24         link* new_node = (link*)malloc(sizeof(link)); //申请新的结点
25         new_node->data = i;
26         new_node->next = NULL;
27         first_node->next = new_node;  //第一个结点的指针域指向这个新申请的结点
28         first_node = new_node;  //第一个结点后移
29     }
30
31     printf("头指针指向的值是:%d\n", phead->data);//1
32     return phead;  //将指向第一个结点的头指针返回
33 }
34
35
36
37 void showLink(link* phead) {
38     link* tmp = phead;//将头指针赋给tmp,tmp也是一个头指针
39     //只要tmp指针指向的结点的next不是Null,就执行输出语句。
40     while (tmp != NULL) {
41         printf("%d ", tmp->data);
42         tmp = tmp->next;
43     }
44     printf("\n");
45 }
46
47 link* getElemByNum(link* phead,int num) {
48     int j = 1; //计数器
49     link* tmp = phead;
50     while (tmp != NULL && num>j) {
51         tmp = tmp->next;
52         j++;
53     }
54     if (tmp == NULL || num<j) {
55         //printf("这个元素不存在\n");
56         return NULL;
57     }
58     else {
59         return tmp;
60     }
61 }
62
63
64 void deleNode(link* phead,int num) {
65     link* tmp = phead;
66     link* front_node = getElemByNum(tmp,num - 1);
67     link* back_node = getElemByNum(tmp, num + 1);
68     link* cur_node = getElemByNum(tmp,num);
69     front_node->next = back_node;
70     free(cur_node);
71     showLink(tmp);
72 }
73
74
75 void main() {
76     //初始化链表(1,2,3,4)
77     printf("初始化链表为:\n");
78     link* phead = initByTailInsert(); //创建头指针,得到经过初始化后的头指针
79     showLink(phead);
80     int num = 0;
81     printf("请输入要删除的结点的号码:");
82     scanf("%d", &num);
83     link* isfind = getElemByNum(phead, num);
84     if (isfind != NULL) {
85         //printf("第%d个元素是:%d", num, isfind->data);
86         printf("删除第%d个结点后的链表是:\n", num);
87         deleNode(phead,num);
88     }
89     else {
90         printf("这个结点没找到\n");
91     }
92
93 }

原文地址:https://www.cnblogs.com/shanlu0000/p/12459972.html

时间: 2024-10-29 19:40:33

16 把第 i 个结点从链表中删除的相关文章

leetcode链表--18、remove-nth-node-from-end-of-list(从链表中删除倒数第k个结点)

题目描述 Given a linked list, remove the nth node from the end of list and return its head. For example, Given linked list: 1->2->3->4->5, and n = 2.   After removing the second node from the end, the linked list becomes 1->2->3->5. Note:

【LeetCode-面试算法经典-Java实现】【083-Remove Duplicates from Sorted List(排序的单链表中删除重复的结点)】

[083-Remove Duplicates from Sorted List(排序的单链表中删除重复的结点)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a sorted linked list, delete all duplicates such that each element appear only once. For example, Given 1->1->2, return 1->2. Given 1->1->2

【LeetCode-面试算法经典-Java实现】【082-Remove Duplicates from Sorted List II(排序链表中删除重复元素II)】

[082-Remove Duplicates from Sorted List II(排序链表中删除重复元素II)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list. For example, Given 1->2->

从无头单链表中删除节点

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

javascript中的链表结构—从链表中删除元素

1.概念 上一个博文我们讲到链表,其中有一个方法remove()是暂时注释的,这个方法有点复杂,需要添加一个Previous()方法找到要删除的元素的前一个节点,这一个博文我们来分析一下这个remove()方法. 从链表中删除节点的时候,需要先找到这个待删除节点的前面的节点.找到这个节点之后修改它的next属性,使其指向待删除节点的下一个节点,这样就把待删除节点给删除了,是不是很简单呢?但是问题来了,我们是不是要找到待删除节点的前面一个节点呢?这样就需要添加一个findPrevious()方法来

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

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

[算法]在单链表和双链表中删除倒数第k个结点

题目: 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 要求: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 解答: 让链表从头走到尾,每移动一步,就让K值减一,当链表走到结尾时,如果K值大于0,说明不用调整链表,因为链表根本没有倒数第K个节点,此时将原链表直接返回即可:如果K值等于0,说明链表倒数第K个节点就是头结点,此时直接返回head.next,相当于删除了头结点.当K的值小于零时,再次从头结点开始走,每移动一步,就让

链表中删除倒数第K个节点

问题描述 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 问题分析与解决 从问题当中,我们只能得到一个链表和要删除的第K个节点的信息,于是就有以下思路:如果链表为空或者K<0时,直接返回:如若不然,遍历链表的每个节点,每经过一个节点K减1.比如对于1 --> 2 --> 3 --> 4该链表的过程如下: K = 5,所遍历的节点以及K值的变化:1 -- > 2 --> 3 --> 4 4,3,2,1: K = 4,所遍

LeetCode 237 Delete Node in a Linked List(在链表中删除节点)

翻译 给定一个访问节点的路径,写一个函数去删除在一个单向链表中除尾部以外的节点. 假设这个链表是1 -> 2 -> 3 -> 4,并且你被给予了第3个值为3的节点,那么在调用你的函数之后这个链表应该变为1 -> 2 -> 4. 原文 Write a function to delete a node (except the tail) in a singly linked list, given only access to that node. Supposed the l