编写一函数子程序,完成遍历一线性单链表各节点,并将遍历的元素 依次进入顺序栈,遍历线性单链表结束时,将栈中全部元素依次出栈。要求 同时设计好 main(),能够运行程序。c语言实现
时间: 2024-12-14 07:20:09 浏览: 11
在C语言中,我们可以使用结构体来表示链表节点,而栈则可以使用数组或动态内存分配的结构来实现。这里是一个简单的示例,包括链表节点的定义、链表的创建以及遍历并入栈的操作:
```c
#include <stdio.h>
#include <stdlib.h>
// 链表节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建新节点
Node* createNode(int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (!newNode) {
printf("Memory allocation failed.\n");
return NULL;
}
newNode->data = value;
newNode->next = NULL;
return newNode;
}
// 将链表节点逐个入栈
void pushToStack(Node* head, Stack* stack) {
Node* current = head;
while (current != NULL) {
// 入栈操作
stack->top = (int*)realloc(stack->top, sizeof(int) * (stack->size + 1));
if (stack->top == NULL) {
printf("Stack overflow.\n");
break;
}
stack->top[stack->size] = current->data;
stack->size++;
current = current->next;
}
}
// 从栈中出栈并打印
void popAndPrint(Stack* stack) {
for (int i = 0; i < stack->size; i++) {
printf("%d ", *(stack->top - i)); // 出栈时注意索引减1
}
printf("\n");
}
// 主函数
int main() {
// 初始化一个空链表和栈
Node* head = NULL;
Stack stack = {NULL, 0};
// 添加链表节点
for (int i = 1; i <= 5; i++) {
Node* newNode = createNode(i);
newNode->next = head;
head = newNode;
}
// 遍历链表并入栈
pushToStack(head, &stack);
// 出栈并打印
printf("Elements after pushing to stack:\n");
popAndPrint(&stack);
return 0;
}
```
这个例子假设`Stack`是一个简单的栈结构,包含一个指向顶部元素的指针`top`和一个整数大小`size`。在这个`main()`函数中,我们创建了一个包含数字1到5的链表,然后遍历它并将每个节点的数据入栈,最后再把栈里的数据按顺序打印出来。
请注意,为了更安全地管理内存,你可以选择使用`malloc`和`free`来动态分配和释放堆内存,而不是在栈上直接调整数组大小。上面的代码简化了这一过程,仅为了演示基本的概念。实际项目中应考虑内存管理的最佳实践。
阅读全文