RX0_UNICORN 的學(xué)生作業(yè):
鏈?zhǔn)綏>毩?xí)
// linkstack.h
#ifndef __LINKSTACK_H__
#define __LINKSTACK_H__
#include
#include
#include
typedef char data_t;
typedef struct node
{
data_t data;
struct node *next;
}linknode_t;
typedef struct
{
linknode_t *top; // 棧頂指針
int n; // 棧中元素個(gè)數(shù)
}linkstack_t;
extern linkstack_t *create_empty_linkstack();
extern int is_empty_linkstack(linkstack_t *sl);
extern int push_linkstack(linkstack_t *sl, data_t data);
extern data_t pop_linkstack(linkstack_t *sl);
extern data_t get_top_data(linkstack_t *sl);
#endif
// linkstack.c
#include "linkstack.h"
// 創(chuàng)建空的棧頂
linkstack_t *create_empty_linkstack()
{
linkstack_t *sl = NULL;
sl = (linkstack_t *)malloc(sizeof(linkstack_t));
if(NULL == sl)
{
printf("malloc is fail!\n");
return NULL;
}
memset(sl, 0, sizeof(linkstack_t));
sl->top = NULL;
return sl;
}
// 判空
int is_empty_linkstack(linkstack_t *sl)
{
return sl->top == NULL ? 1 : 0;
}
// 入棧
int push_linkstack(linkstack_t *sl, data_t data)
{
// 為新節(jié)點(diǎn)申請堆區(qū)空間,并為 temp->data 賦值
linknode_t *temp = (linknode_t *)malloc(sizeof(linknode_t));
if(NULL == temp)
{
printf("temp malloc is fail!\n");
return -1;
}
temp->data = data;
//
temp->next = sl->top;
sl->top = temp;
sl->n++;
return 0;
}
// 出棧
data_t pop_linkstack(linkstack_t *sl)
{
// 保存刪除節(jié)點(diǎn)的地址(原棧頂指針)
linknode_t *temp = sl->top;
// 保存節(jié)點(diǎn)數(shù)據(jù)
data_t data = temp->data;
// 更新棧頂指針,--- 即將刪除節(jié)點(diǎn)保存的下一個(gè)節(jié)點(diǎn)的地址
sl->top = temp->next;
// 釋放空間
free(temp);
temp = NULL;
// 更新 n
sl->n--;
return data;
}
// 打印棧頂元素
data_t get_top_data(linkstack_t *sl)
{
return sl->top->data;
}
// linkstack main.c
#include "linkstack.h"
int main(int argc, const char *argv[])
{
data_t data[] = {'a','n','i','h','c',' ','e','v','o','l',' ','I'};
linkstack_t *sl = create_empty_linkstack();
for (int i = 0; i < sizeof(data)/sizeof(data[0]); i++)
{
push_linkstack(sl, data[i]);
}
// data_t top_d = get_top_data(sl);
// printf("%c\n", top_d);
while (!is_empty_linkstack(sl))
{
data_t ret = pop_linkstack(sl);
printf("%c", ret);
}
printf("\n");
return 0;
}
鏈?zhǔn)疥?duì)列練習(xí)
// linkqueue.h
#ifndef __LINKQUEUE_H__
#define __LINKQUEUE_H__
#include
#include
#include
typedef char data_t;
// 鏈?zhǔn)疥?duì)列節(jié)點(diǎn)類型
typedef struct node
{
data_t data;
struct node *next;
}linknode_t;
// 鏈?zhǔn)疥?duì)列隊(duì)列頭類型
typedef struct
{
linknode_t *front;
linknode_t *rear;
}linkqueue_t;
extern linkqueue_t *create_empty_linkqueue();
extern int is_empty_linkqueue(linkqueue_t *lq);
extern void enter_data_linkqueue(linkqueue_t *lq, data_t data);
extern data_t delete_data_linkqueue(linkqueue_t *lq);
#endif
// linkqueue.c
#include "linkqueue.h"
linkqueue_t *create_empty_linkqueue()
{
linkqueue_t *lq = NULL;
linknode_t *head = NULL;
head = (linknode_t *)malloc(sizeof(linknode_t));
lq = (linkqueue_t *)malloc(sizeof(linkqueue_t));
if(NULL == lq || NULL == head)
{
printf("malloc is fail!\n");
return NULL;
}
head->next = NULL;
lq->front = lq->rear = head;
return lq;
}
int is_empty_linkqueue(linkqueue_t *lq)
{
return lq->front == lq->rear ? 1 : 0;
}
void enter_data_linkqueue(linkqueue_t *lq, data_t data)
{
linknode_t *temp = NULL;
temp = (linknode_t *)malloc(sizeof(linknode_t));
if(NULL == temp)
{
printf("malloc is fail!\n");
return;
}
temp->data = data;
temp->next = lq->rear->next;
lq->rear->next = temp;
lq->rear = temp;
return;
}
data_t delete_data_linkqueue(linkqueue_t *lq)
{
data_t data;
linknode_t *temp = NULL;
temp = lq->front->next;
data = temp->data;
lq->front->next = temp->next;
free(temp);
temp = NULL;
if(lq->front->next == NULL)
{
lq->rear = lq->front;
}
return data;
}
// linkqueue main.c
#include "linkqueue.h"
int main(int argc, const char *argv[])
{
char data[] = {'I', ' ', 'L', 'o', 'v', 'e', ' ', 'C', 'h', 'i', 'n', 'a'};
linkqueue_t *lq = create_empty_linkqueue();
for(int i = 0; i < sizeof(data)/sizeof(data[0]); i++)
{
enter_data_linkqueue(lq, data[i]);
}
while(!is_empty_linkqueue(lq))
{
data_t ret = delete_data_linkqueue(lq);
printf("%c", ret);
}
printf("\n");
return 0;
}