C語言資料結構棧鏈式結構
阿新 • • 發佈:2019-01-10
棧的鏈式結構
連結串列節點
typedef struct node {
char c; // 資料
struct node *next; // 指標
}node, *pt;
棧頂指標
typedef struct stack {
pt top; // 指向棧頂
int count; // 可用來記錄棧的大小
}stack;
入棧操作
void in (char c, stack * p) // c為資料, *p為棧頂指標的指標,用來改變棧頂指標的值
{
pt current;
current = (pt) malloc (sizeof(node)); // 新建節點
current->next = (*p).top; // 新建的節點指向上一個新建的節點
current->c = c; // 資料賦值
(*p).top = current; // 改變站頂指標,使其指向新建的節點。
(*p).count++; // 棧長度計數自增
}
出棧操作
void out (char * c, stack * p) // 將c的指標傳入,用來傳遞出棧的值。將棧頂指標的指標傳入。
{
pt prev;
prev = (*p).top; // 先記錄下要出棧釋放的節點。
if ((*p).top->next == NULL) // 如果棧為空棧則返回空格
{
*c = 32 ;
return ; // 空棧則跳出函式
}
*c = (*p).top->c; // 值傳遞,將出棧的值傳出。
(*p).top = (*p).top->next; // 棧頂指向棧的上個節點
(*p).count--; // 計數器自減
free(prev) ; // 釋放出棧的節點
}
遍歷棧並輸出
void print(stack p)
{
pt current = (*p).top; // 指向棧頂的節點
while (current != NULL)
{
putchar(current->c) ;
current = current->next;
}
printf("\n");
}
具體測試
#include<stdio.h>
#include<stdlib.h>
typedef struct node {
char c;
struct node *next;
}node, *pt;
typedef struct stack {
pt top;
int count;
}stack;
void creat (stack * p);
void in (char c, stack * p);
void out (char * c, stack * p);
void print( stack p);
int main ()
{
char c;
stack p;
creat(&p);
while(scanf("%c", &c) != EOF)
{
getchar();
in(c, &p);
}
print(p);
while(1)
{
getchar();
out(&c, &p);
if (c == 32) break;
printf("出棧%c\n", c);
print(p);
}
}
void creat (stack * p)
{
(*p).top = NULL;
(*p).count = 0;
}
void in (char c, stack * p)
{
pt current;
current = (pt) malloc (sizeof(node));
current->next = (*p).top;
current->c = c;
(*p).top = current;
(*p).count++;
}
void out (char * c, stack * p)
{
pt prev;
prev = (*p).top;
*c = (*p).top->c;
if ((*p).top->next == NULL)
{
*c = 32;
return ;
}
(*p).top = (*p).top->next;
(*p).count--;
free(prev) ;
}
void print(stack p)
{
pt current = p.top;
while (current != NULL)
{
putchar(current->c) ;
current = current->next;
}
printf("\n");
}
測試結果