用C语言写出删除第I个节点的代码
时间: 2024-12-19 19:14:36 浏览: 7
在C语言中,如果你正在处理单链表,并想删除指定位置的节点,你需要考虑头结点的情况以及普通节点的情况。这里提供一个简单的示例,假设链表节点结构如下:
```c
typedef struct Node {
int data;
struct Node* next;
} Node;
```
删除第 `i` 个节点的函数可以像下面这样实现,其中 `head` 是链表的头指针:
```c
void deleteNode(Node** head, int i) {
if (*head == NULL || i <= 0) return; // 检查链表是否为空或者索引无效
Node* current = *head;
Node* previous = NULL;
// 遍历链表找到第i个节点
for (int j = 1; j < i && current != NULL; j++) {
previous = current;
current = current->next;
}
// 如果找到了目标节点,则删除它
if (current != NULL) {
// 将前一个节点的下一个节点指向当前节点的下一个节点
previous->next = current->next;
// 释放当前节点的内存
free(current);
}
}
```
相关问题
用c语言写出这个问题的代码
以下是一个简单的C语言代码示例,用于实现头结点的单链表差集运算。请注意,这里并没有真正的删除操作,因为我们是在原地更新A链表。实际应用中,可能需要借助临时变量或者更复杂的链表操作来实现。
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 创建链表节点
ListNode* createNode(int val) {
ListNode *node = (ListNode*)malloc(sizeof(ListNode));
node->val = val;
node->next = NULL;
return node;
}
// 差集运算函数
void differenceList(ListNode** A, ListNode** B) {
if (*A == NULL || *B == NULL) return; // 如果任一链表为空,返回
ListNode *p1 = *A, *p2 = *B;
while (p1 && p2) {
if (p1->val > p2->val) {
p1 = p1->next;
} else {
if (p1->val == p2->val) {
p1 = p1->next; // 忽略相等的元素
} else { // 删除A链表中大于B链表元素
ListNode *prev = p1->next;
prev->next = p1->next;
free(p1);
p1 = prev;
}
}
p2 = p2->next;
}
// 如果B链表还有剩余,将A链表中剩余的节点依次加入结果
while (p1) {
printf("%d ", p1->val); // 输出结果
p1 = p1->next;
}
}
// 示例链表初始化
void initLinkedList(ListNode** list, int* arr, int size) {
for (int i = 0; i < size; i++) {
*list = createNode(arr[i]);
*list = (*list)->next;
}
}
int main() {
int A[] = {5, 9, 12, 18};
int B[] = {4, 7, 12, 16, 18};
int lenA = sizeof(A) / sizeof(A[0]);
int lenB = sizeof(B) / sizeof(B[0]);
ListNode *A_head = NULL, *B_head = NULL;
initLinkedList(&A_head, A, lenA);
initLinkedList(&B_head, B, lenB);
differenceList(&A_head, &B_head);
return 0;
}
```
此代码首先创建了两个链表`A_head`和`B_head`,然后通过`differenceList`函数计算差集,最后输出结果。注意,这只是一个简化的版本,实际操作中可能需要考虑链表的内存管理、错误处理等问题。
用C语言写一段代码,二叉树节点是char类型,实现二叉树节点的删除操作,具体过程为根据输入的节点,在二叉树中找到该节点,删除该节点的左子树
以下是用C语言实现二叉树节点删除操作的代码,具体过程为根据输入的节点,在二叉树中找到该节点,删除该节点的左子树:
```c
#include<stdio.h>
#include<stdlib.h>
struct node {
char data;
struct node *left;
struct node *right;
};
struct node *create_node(char value) {
struct node *new_node = (struct node*)malloc(sizeof(struct node));
new_node->data = value;
new_node->left = NULL;
new_node->right = NULL;
return new_node;
}
struct node *insert_node(struct node *root, char value) {
if(root==NULL) {
return create_node(value);
}
if(value < root->data) {
root->left = insert_node(root->left, value);
}
else {
root->right = insert_node(root->right, value);
}
return root;
}
struct node *find_node(struct node *root, char value) {
if(root==NULL || root->data==value) {
return root;
}
if(value < root->data) {
return find_node(root->left, value);
}
else {
return find_node(root->right, value);
}
}
struct node *delete_left_subtree(struct node *root, char value) {
struct node *node_to_delete = find_node(root, value);
if(node_to_delete!=NULL && node_to_delete->left!=NULL) {
node_to_delete->left = NULL;
}
return root;
}
void inorder_traversal(struct node *root) {
if(root!=NULL) {
inorder_traversal(root->left);
printf("%c ", root->data);
inorder_traversal(root->right);
}
}
int main() {
struct node *root = NULL;
root = insert_node(root, 'F');
root = insert_node(root, 'D');
root = insert_node(root, 'J');
root = insert_node(root, 'B');
root = insert_node(root, 'E');
root = insert_node(root, 'G');
root = insert_node(root, 'K');
root = insert_node(root, 'A');
root = insert_node(root, 'C');
root = insert_node(root, 'I');
root = insert_node(root, 'H');
printf("Inorder traversal before deleting left subtree of node D:\n");
inorder_traversal(root);
printf("\n");
root = delete_left_subtree(root, 'D');
printf("Inorder traversal after deleting left subtree of node D:\n");
inorder_traversal(root);
printf("\n");
return 0;
}
```
这段代码实现了二叉树节点的删除操作,具体过程为根据输入的节点,在二叉树中找到该节点,删除该节点的左子树。在这个例子中,我们创建了一个二叉树,并在其中插入了一些节点。然后打印出插入节点后的中序遍历结果。接着删除节点D的左子树,并再次打印出删除左子树后的中序遍历结果。
阅读全文