顺序表删除某一个结点怎么做
时间: 2023-05-15 10:08:06 浏览: 54
顺序表删除某一个结点的步骤如下:
1. 首先,我们需要找到这个结点在顺序表中的位置。
2. 如果这个结点是顺序表的第一个结点,那么我们可以直接将顺序表的第一个结点设为它的下一个结点。
3. 如果这个结点不是顺序表的第一个结点,我们就需要找到它的前驱结点,然后将它的前驱结点的 next 指针设为它的下一个结点。
4. 最后,我们可以将这个结点的数据清空,并将它的 next 指针设为 null,以便进行垃圾回收。
注意:在删除结点的过程中,如果顺序表只有一个结点,那么我们需要特判,避免出现空指针异常。
相关问题
二叉排序树,用顺序表(一维数组)作存储结构 1 以回车为输入结束标志,输入数列L,生成一棵二叉排序树T 2 对二叉树T作中序遍历,输出结果 3 计算二叉排序树T查找成功的平均查找长度,输出结果 4 输入元素X,查找二叉排序树T,若存在含X的结点,则删除该结点,并做中序遍历,执行操作2,否则输出信息”无X“用C语言来完成
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef struct {
int data[MAXSIZE];
int length;
} SqList;
typedef struct BiTNode {
int data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
void InitList(SqList *L) {
L->length = 0;
}
int ListInsert(SqList *L, int value) {
if (L->length == MAXSIZE) {
return 0;
}
L->data[L->length++] = value;
return 1;
}
BiTNode *CreateBST(SqList *L) {
BiTNode *T = NULL;
for (int i = 0; i < L->length; i++) {
BiTNode *p = (BiTNode *)malloc(sizeof(BiTNode));
p->data = L->data[i];
p->lchild = NULL;
p->rchild = NULL;
if (T == NULL) {
T = p;
} else {
BiTNode *q = T;
while (q != NULL) {
if (p->data < q->data) {
if (q->lchild == NULL) {
q->lchild = p;
break;
} else {
q = q->lchild;
}
} else {
if (q->rchild == NULL) {
q->rchild = p;
break;
} else {
q = q->rchild;
}
}
}
}
}
return T;
}
void InOrderTraverse(BiTree T) {
if (T != NULL) {
InOrderTraverse(T->lchild);
printf("%d ", T->data);
InOrderTraverse(T->rchild);
}
}
int SearchBST(BiTree T, int key, int *count) {
int flag = 0;
*count = 0;
BiTNode *p = T;
while (p != NULL) {
(*count)++;
if (p->data == key) {
flag = 1;
break;
} else if (p->data > key) {
p = p->lchild;
} else {
p = p->rchild;
}
}
return flag;
}
void DeleteNode(BiTree *T, int key) {
if (*T == NULL) {
return;
}
if ((*T)->data == key) {
if ((*T)->lchild == NULL && (*T)->rchild == NULL) {
free(*T);
*T = NULL;
} else if ((*T)->lchild == NULL) {
BiTNode *p = *T;
*T = (*T)->rchild;
free(p);
p = NULL;
} else if ((*T)->rchild == NULL) {
BiTNode *p = *T;
*T = (*T)->lchild;
free(p);
p = NULL;
} else {
BiTNode *p = (*T)->rchild;
while (p->lchild != NULL) {
p = p->lchild;
}
(*T)->data = p->data;
DeleteNode(&((*T)->rchild), p->data);
}
} else if ((*T)->data > key) {
DeleteNode(&((*T)->lchild), key);
} else {
DeleteNode(&((*T)->rchild), key);
}
}
float GetASL(BiTree T, SqList *L) {
int count = 0;
float sum = 0;
for (int i = 0; i < L->length; i++) {
if (SearchBST(T, L->data[i], &count)) {
sum += count;
}
}
return sum / L->length;
}
int main() {
SqList L;
InitList(&L);
printf("请输入一些数字(以回车为结束标志):\n");
int num;
while (scanf("%d", &num) != EOF) {
if (!ListInsert(&L, num)) {
printf("数组已满,无法插入!\n");
break;
}
}
BiTree T = CreateBST(&L);
printf("中序遍历结果为:\n");
InOrderTraverse(T);
printf("\n");
float asl = GetASL(T, &L);
printf("查找成功的平均查找长度为:%.2f\n", asl);
int key;
printf("请输入要删除的数字:\n");
scanf("%d", &key);
if (SearchBST(T, key, &num)) {
DeleteNode(&T, key);
printf("删除成功!中序遍历结果为:\n");
InOrderTraverse(T);
printf("\n");
} else {
printf("无该数字!\n");
}
return 0;
}
```
实现二叉排序树上的查找、插入、删除算法。具体实现要求: 1. 用二叉链表做存储结构,输入键值序列,利用查找、插入算法建立一棵二叉排序树。 2. 按中序遍历这棵二叉排序树。 3. 在二叉排序树上插入结点。 4. 删除二叉排序树上的结点。
好的,我会为你详细解答。
1. 建立二叉排序树
在建立二叉排序树之前,我们需要先定义一个二叉树的结构体,包含左右子节点以及节点的值:
```
typedef struct BSTNode {
int data;
struct BSTNode *left;
struct BSTNode *right;
} BSTNode, *BSTree;
```
接下来,我们可以实现二叉排序树的查找、插入算法:
```
// 查找算法
BSTNode* BSTFind(BSTree root, int key) {
if (root == NULL)
return NULL;
else if (key < root->data)
return BSTFind(root->left, key);
else if (key > root->data)
return BSTFind(root->right, key);
else
return root;
}
// 插入算法
void BSTInsert(BSTree *root, int key) {
if (*root == NULL) {
BSTNode *node = (BSTNode*)malloc(sizeof(BSTNode));
node->data = key;
node->left = node->right = NULL;
*root = node;
}
else {
if (key < (*root)->data)
BSTInsert(&(*root)->left, key);
else if (key > (*root)->data)
BSTInsert(&(*root)->right, key);
}
}
```
输入键值序列后,我们可以按顺序将序列中的元素插入到二叉排序树中,建立起一棵完整的二叉排序树。
2. 中序遍历二叉排序树
中序遍历是指先访问左子树,然后访问根节点,最后访问右子树。我们可以实现以下中序遍历算法:
```
void BSTInOrderTraverse(BSTree root) {
if (root != NULL) {
BSTInOrderTraverse(root->left);
printf("%d ", root->data);
BSTInOrderTraverse(root->right);
}
}
```
3. 插入节点到二叉排序树
当我们需要在二叉排序树中插入一个新的节点时,可以使用上面提到的插入算法,将新节点插入到正确的位置上。
4. 删除二叉排序树中的节点
删除二叉排序树中的节点需要考虑三种情况:
- 节点是叶子节点,直接删除。
- 节点只有一个子节点,将子节点替换到该节点的位置上。
- 节点有两个子节点,需要找到该节点的前驱或后继节点进行替换。
下面是删除节点的实现:
```
void BSTDelete(BSTree *root, int key) {
if (*root == NULL) return;
if (key < (*root)->data)
BSTDelete(&(*root)->left, key);
else if (key > (*root)->data)
BSTDelete(&(*root)->right, key);
else {
if ((*root)->left == NULL && (*root)->right == NULL) {
free(*root);
*root = NULL;
}
else if ((*root)->left == NULL) {
BSTNode *temp = *root;
*root = (*root)->right;
free(temp);
}
else if ((*root)->right == NULL) {
BSTNode *temp = *root;
*root = (*root)->left;
free(temp);
}
else {
BSTNode *temp = (*root)->right;
while (temp->left)
temp = temp->left;
(*root)->data = temp->data;
BSTDelete(&(*root)->right, temp->data);
}
}
}
```
以上就是二叉排序树的查找、插入、删除算法的具体实现。