不带头结点的链栈初始化
时间: 2023-05-29 22:01:24 浏览: 199
链栈的定义是一个单链表,因此初始化需要创建一个结构体表示单链表头节点的结构体,即一个指向栈顶元素的指针,初始化时将其赋值为NULL即可。
具体实现如下:
```c
typedef struct Node {
int data;
struct Node *next;
} Node, *Stack;
//初始化链栈
void initStack(Stack *s){
*s = NULL; //栈顶指针赋值为NULL
}
```
其中,Stack类型是栈的定义,即一个指向栈顶元素的指针。在初始化时,将栈顶指针赋值为NULL,表示链栈为空栈。
相关问题
带头结点的链栈初始化和增删改查c代码以及不带头结点的链栈初始化和增删改查c代码
带头节点的链栈初始化和增删改查的C代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链栈节点结构
typedef struct Node {
int data;
struct Node* next;
} Node;
// 初始化链栈(带头节点)
void initStack(Node** top) {
*top = (Node*)malloc(sizeof(Node));
(*top)->next = NULL;
}
// 判断链栈是否为空
int isEmpty(Node* top) {
return top->next == NULL;
}
// 入栈
void push(Node* top, int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = top->next;
top->next = newNode;
printf("Pushed %d\n", value);
}
// 出栈
int pop(Node* top) {
if (isEmpty(top)) {
printf("Stack is empty\n");
return -1;
}
Node* temp = top->next;
int value = temp->data;
top->next = temp->next;
free(temp);
printf("Popped %d\n", value);
return value;
}
// 查询栈顶元素
int peek(Node* top) {
if (isEmpty(top)) {
printf("Stack is empty\n");
return -1;
}
return top->next->data;
}
// 主函数测试链栈操作(带头节点)
int main() {
Node* top;
initStack(&top);
push(top, 10);
push(top, 20);
push(top, 30);
int topValue = peek(top);
printf("Top element: %d\n", topValue);
int poppedValue = pop(top);
printf("Popped element: %d\n", poppedValue);
topValue = peek(top);
printf("Top element: %d\n", topValue);
return 0;
}
```
不带头节点的链栈初始化和增删改查的C代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链栈节点结构
typedef struct Node {
int data;
struct Node* next;
} Node;
// 初始化链栈(不带头节点)
void initStack(Node** top) {
*top = NULL;
}
// 判断链栈是否为空
int isEmpty(Node* top) {
return top == NULL;
}
// 入栈
void push(Node** top, int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = *top;
*top = newNode;
printf("Pushed %d\n", value);
}
// 出栈
int pop(Node** top) {
if (isEmpty(*top)) {
printf("Stack is empty\n");
return -1;
}
int value = (*top)->data;
Node* temp = *top;
*top = (*top)->next;
free(temp);
printf("Popped %d\n", value);
return value;
}
// 查询栈顶元素
int peek(Node* top) {
if (isEmpty(top)) {
printf("Stack is empty\n");
return -1;
}
return top->data;
}
// 主函数测试链栈操作(不带头节点)
int main() {
Node* top;
initStack(&top);
push(&top, 10);
push(&top, 20);
push(&top, 30);
int topValue = peek(top);
printf("Top element: %d\n", topValue);
int poppedValue = pop(&top);
printf("Popped element: %d\n", poppedValue);
topValue = peek(top);
printf("Top element: %d\n", topValue);
return 0;
}
```
这两段代码分别实现了带头节点和不带头节点的链栈的初始化、入栈、出栈和查询操作。你可以根据需要选择使用其中的一种方式。记得根据实际情况修改和扩展这个代码以满足具体的需求。
带头结点和不带头结点的链栈具体操作
带头结点的链栈具体操作如下:
1. 初始化链栈:创建一个头结点,并将头结点的next指针指向NULL。
2. 入栈操作:在头结点后插入一个新节点,将新节点的数据域设置为要插入的元素,将新节点的next指针指向原来的第一个节点,然后将头结点的next指针指向新节点。
3. 出栈操作:将头结点的next指针指向的节点删除,并返回该节点的数据域作为出栈的元素。
4. 判断栈空:判断头结点的next指针是否为NULL,如果是则栈空,否则栈非空。
5. 销毁链栈:从头结点的next指针开始,依次释放每个节点的内存空间,最后释放头结点的内存空间。
不带头结点的链栈具体操作如下:
1. 初始化链栈:将链栈设置为NULL。
2. 入栈操作:如果链栈为空,特殊处理,创建一个新节点,并将新节点的数据域设置为要插入的元素,将新节点的next指针指向NULL,然后将链栈指向新节点;如果链栈不为空,创建一个新节点,并将新节点的数据域设置为链栈的数据域,将链栈的数据域设置为要插入的元素,将新节点的next指针指向链栈的next指针,然后将链栈的next指针指向新节点。
3. 出栈操作:将链栈指向的节点删除,并返回该节点的数据域作为出栈的元素。
4. 判断栈空:判断链栈是否为NULL,如果是则栈空,否则栈非空。
5. 销毁链栈:从链栈开始,依次释放每个节点的内存空间。
#### 引用[.reference_title]
- *1* *2* *3* [使用C语言实现链栈(带头结点和不带头结点)](https://blog.csdn.net/Keep_Trying_Go/article/details/126284714)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
阅读全文
相关推荐







