Stack_Node *p;int e;p=top->next;*e=p->next;top->next=p->next;free(p)在链栈中是什么操作,每一步是什么意思
时间: 2023-06-08 09:07:47 浏览: 57
这是链栈中的出栈操作。每一步的意义如下:
1. 将p指向栈顶元素的下一个节点。
2. 将e赋值为栈顶元素的值。
3. 将栈顶指针指向栈顶元素的下一个节点。
4. 释放原先的栈顶元素p所指向的节点。
这个操作会将栈顶元素从栈中弹出,并返回其值。
相关问题
优化以下代码#include <stdio.h> #include <stdlib.h> typedef struct TreeNode { char data; struct TreeNode* left; struct TreeNode* right; } TreeNode; TreeNode* createTree() { char ch; TreeNode* root; scanf("%c", &ch); if (ch == '#') { return NULL; } root = (TreeNode*)malloc(sizeof(TreeNode)); root->data = ch; root->left = createTree(); root->right = createTree(); return root; } void digui(TreeNode* root) { if (root == NULL) { return; } digui(root->left); printf("%c ", root->data); digui(root->right); } typedef struct StackNode { TreeNode* tree; struct StackNode* next; } StackNode; typedef struct Stack { StackNode* top; int size; } Stack; Stack* createStack() { Stack* stack = (Stack*)malloc(sizeof(Stack)); stack->top = NULL; stack->size = 0; return stack; } void push(Stack* stack, TreeNode* tree) { StackNode* node; node = (StackNode*)malloc(sizeof(StackNode)); node->tree = tree; node->next = stack->top; stack->top = node; stack->size++; } TreeNode* pop(Stack* stack) { TreeNode* tree; StackNode* temp; if (stack->size == 0) { return NULL; } tree = stack->top->tree; temp = stack->top; stack->top = stack->top->next; stack->size--; free(temp); return tree; } void feidigui(TreeNode* root) { Stack* stack; TreeNode* p; stack = createStack(); p = root; while (p != NULL || stack->size != 0) { while (p != NULL) { push(stack, p); p = p->left; } if (stack->size != 0) { p = pop(stack); printf("%c ", p->data); p = p->right; } } } int getHeight(TreeNode* root) { int leftHeight,rightHeight,max; if (root == NULL) { return 0; } leftHeight = getHeight(root->left); rightHeight = getHeight(root->right); max=leftHeight>rightHeight?leftHeight:rightHeight; return max+1; }
首先,这段代码的缩进不太规范,可以调整一下,使得代码更加清晰易读。
其次,在函数中出现了多次重复的代码,如创建栈、入栈、出栈等,可以将这些代码封装成一个通用的函数,以便在程序中反复使用。
最后,可以考虑使用更加简洁的写法,如使用三目运算符代替if-else语句,使用递归函数代替while循环等,以提高代码的可读性和可维护性。同时,可以加上注释,方便他人理解代码逻辑。
下面是一个优化后的代码示例:
```
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
char data;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 创建二叉树
TreeNode* createTree() {
char ch;
scanf("%c", &ch);
if (ch == '#') {
return NULL;
}
TreeNode *root = (TreeNode*)malloc(sizeof(TreeNode));
root->data = ch;
root->left = createTree();
root->right = createTree();
return root;
}
// 递归遍历二叉树
void digui(TreeNode *root) {
if (root == NULL) {
return;
}
digui(root->left);
printf("%c ", root->data);
digui(root->right);
}
typedef struct StackNode {
TreeNode *tree;
struct StackNode *next;
} StackNode;
typedef struct Stack {
StackNode *top;
int size;
} Stack;
// 创建栈
Stack* createStack() {
Stack *stack = (Stack*)malloc(sizeof(Stack));
stack->top = NULL;
stack->size = 0;
return stack;
}
// 入栈
void push(Stack *stack, TreeNode *tree) {
StackNode *node = (StackNode*)malloc(sizeof(StackNode));
node->tree = tree;
node->next = stack->top;
stack->top = node;
stack->size++;
}
// 出栈
TreeNode* pop(Stack *stack) {
if (stack->size == 0) {
return NULL;
}
TreeNode *tree = stack->top->tree;
StackNode *temp = stack->top;
stack->top = stack->top->next;
stack->size--;
free(temp);
return tree;
}
// 非递归遍历二叉树
void feidigui(TreeNode *root) {
Stack *stack = createStack();
TreeNode *p = root;
while (p != NULL || stack->size != 0) {
if (p != NULL) {
push(stack, p);
p = p->left;
} else {
p = pop(stack);
printf("%c ", p->data);
p = p->right;
}
}
}
// 获取二叉树的高度
int getHeight(TreeNode *root) {
if (root == NULL) {
return 0;
}
int leftHeight = getHeight(root->left);
int rightHeight = getHeight(root->right);
return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;
}
int main() {
TreeNode *root = createTree();
digui(root);
printf("\n");
feidigui(root);
printf("\n");
printf("%d\n", getHeight(root));
return 0;
}
```
写出用互斥锁保证改代码线程安全的代码:typedef struct Node struct Node *next; int value; } Node; void push(Node **top_ptr, Node *n) { n->next = *top_ptr; *top_ptr = n; Node *pop (Node **top_ptr) { if (*top_ptr == NULL) } return NULL; Node *p = *top; *top_ptr = (*top_ptr)->next; return p;
下面是使用互斥锁保证代码线程安全的示例代码:
```c
#include <pthread.h>
typedef struct Node {
struct Node *next;
int value;
} Node;
typedef struct Stack {
Node *top;
pthread_mutex_t mutex;
} Stack;
void push(Stack *stack, Node *node) {
pthread_mutex_lock(&stack->mutex);
node->next = stack->top;
stack->top = node;
pthread_mutex_unlock(&stack->mutex);
}
Node *pop(Stack *stack) {
pthread_mutex_lock(&stack->mutex);
if (stack->top == NULL) {
pthread_mutex_unlock(&stack->mutex);
return NULL;
}
Node *node = stack->top;
stack->top = stack->top->next;
pthread_mutex_unlock(&stack->mutex);
return node;
}
```
在这个示例代码中,我们为 `Stack` 结构体增加了一个互斥锁 `mutex`。在 `push` 和 `pop` 函数中,我们使用 `pthread_mutex_lock` 和 `pthread_mutex_unlock` 函数来对共享资源 `top` 进行保护,保证同一时间只有一个线程会访问共享资源。这样,就可以避免多个线程同时访问共享资源导致的数据竞争问题,保证代码的线程安全性。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)