70,020
社区成员




//这是一个链式堆栈的判空、压栈、出栈、取栈顶等操作
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MaxSize 100
typedef int bool;
#define T 1
#define F 0
typedef int DataType;
typedef struct stack{
DataType data;
struct stack *next;
}ListStack;
//堆栈初始化
void ListStackInit(ListStack *stack)
{
if ((stack=(ListStack*)malloc(sizeof(ListStack)))==NULL)
{
exit(1);
}
stack->next = NULL;
}
//堆栈判断是否为空
int ListStackEmpty(ListStack *stack)
{
if (stack->next == NULL)
{
return 0;
}
else
{
return 1;
}
}
//堆栈进栈
int ListStackPush(ListStack *stack, DataType x)
{
ListStack *pTemp;
if ((pTemp = (ListStack*)malloc(sizeof(ListStack))) == NULL)
{
return 0;
}
pTemp->data = x;
pTemp->next = stack->next;
stack->next = pTemp;
return 1;
}
//堆栈出栈
int ListStackPop(ListStack *stack, DataType *x)
{
ListStack *del;
del = stack->next;//赋值
if (del==NULL)
{
return 0;
}
stack->next = del->next;
*x = del->data;
free(del);
return 1;
}
//堆栈取出栈顶
int ListStackTopPop(ListStack *stack,DataType *n)
{
if (stack->next==NULL)
{
return 0;
}
else
{
*n=stack->next->data;
return 1;
}
}
//链表销毁
void ListDestroy(ListStack *stack)
{
ListStack *pTemp, *del;
//if ((del = (ListStack*)malloc(sizeof(ListStack))) == NULL)
//{
// return 0;
//}
pTemp = stack;
while (pTemp!=NULL)
{
del = pTemp;
pTemp = pTemp->next;
free(del); //2018年8月16日 08:59:48 出现中断?
}
/*stack->next = NULL;*/
}
//主函数
int main()
{
ListStack head;
int x, i,m;
ListStackInit(&head);
for ( i = 0; i < 10; i++)
{
if ((ListStackPush(&head, i + 1)) == 0)
{
printf("插入错误\n");
getchar();
return ;
}
}
ListStackTopPop(&head, &m);
printf("栈顶=%d\n",m );
for ( i = 0; i < 10; i++)
//while (ListStackEmpty(&head)!=0/*head.next!=NULL*/) //替换for循环在ListStackPop()中出现中断
{
if ((ListStackPop(&head,&x)==0))
{
printf("取出错误\n");
getchar();
return;
}
else
{
printf("%d ", x);
}
}
ListDestroy(&head);
getchar();
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MaxSize 100
#define T 1
#define F 0
typedef int DataType;
typedef struct stack{
DataType data;
struct stack *next;
}ListStack;
//堆栈初始化
void ListStackInit(ListStack** stack)
{
if (((*stack) = (ListStack*)malloc(sizeof(ListStack))) == NULL)
{
exit(1);
}
(*stack)->next = NULL;
}
//堆栈判断是否为空
int ListStackEmpty(ListStack *stack)
{
if (stack->next == NULL)
{
return 0;
}
else
{
return 1;
}
}
//堆栈进栈
int ListStackPush(ListStack *stack, DataType x)
{
ListStack *pTemp;
if ((pTemp = (ListStack*)malloc(sizeof(ListStack))) == NULL)
{
return 0;
}
pTemp->data = x;
pTemp->next = stack->next;
stack->next = pTemp;
return 1;
}
//堆栈出栈
int ListStackPop(ListStack *stack, DataType *x)
{
ListStack *del;
del = stack->next;//赋值
if (del == NULL)
{
return 0;
}
stack->next = del->next;
*x = del->data;
free(del);
return 1;
}
//堆栈取出栈顶
int ListStackTopPop(ListStack *stack, DataType *n)
{
if (stack->next == NULL)
{
return 0;
}
else
{
*n = stack->next->data;
return 1;
}
}
//链表销毁
void ListDestroy(ListStack** stack)
{
ListStack *pTemp, *del;
pTemp = *stack;
pTemp = pTemp->next;
while (pTemp != NULL)
{
del = pTemp;
pTemp = pTemp->next;
free(del);
del = NULL;
}
free(*stack);
*stack = NULL;
}
//主函数
int main()
{
ListStack* head;
int x, i, m;
ListStackInit(&head);
for (i = 0; i < 10; i++)
{
if ((ListStackPush(head, i + 1)) == 0)
{
printf("插入错误\n");
getchar();
return 0;
}
}
ListStackTopPop(head, &m);
printf("栈顶=%d\n", m);
for (i = 0; i < 10; i++)
{
if ((ListStackPop(head, &x) == 0))
{
printf("取出错误\n");
getchar();
return 0;
}
else
{
printf("%d ", x);
}
}
free(head); //因为前面调用了ListStackPop函数,已经把一些元素释放掉内存了,所以这里直接调用free头就可以了。
head = NULL;
getchar();
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
//定义抽象数据
typedef int DataType;
typedef struct queue{
DataType data;
struct queue *next;
}Queue;
//定义链式队列的头尾指针
typedef struct{
Queue *front;
Queue *rear;
}ListQueue;
//链式队列初始化
void ListQueueInit(ListQueue *myQ)
{
myQ->front = NULL;
myQ->rear = NULL;
}
//链式队列判断是否为空
int ListQueueNoEmpty(ListQueue myQ)
{
if (myQ.front==NULL)
{
return 1;
}
else
{
return 0;
}
}
//链式队列的入队操作
int ListQueuePush(ListQueue *myQ, DataType x)
{
Queue *pTemp;
if ((pTemp=(Queue*)malloc(sizeof(Queue)))==NULL)
{
return 0;
}
pTemp->data = x;
if (myQ->rear!=NULL) //第一次入队的时候rear为null所以不执行。
{
myQ->rear->next = pTemp;
}
myQ->rear = pTemp; //将队尾指针指向第一个入队的元素。
if (myQ->front==NULL)
{
myQ->front = pTemp;//将队头指针指向第一个入队的元素,然后不再移动。
}
return 1;
}
//链式队列的出队操作
int ListQueuePop(ListQueue *myQ, DataType *x)
{
ListQueue *del;
if ((del = (ListQueue*)malloc(sizeof(ListQueue))) == NULL)
{
return 0;
}
if (myQ->front==NULL&&myQ->rear==NULL)
{
return 0;
}
*x = myQ->front->data;
del->front = myQ->front;
myQ->front = myQ->front->next;
if (myQ->front==NULL)//如果只有一个节点
{
myQ->rear = NULL;
}
free(del);
return 1;
}
//链式队列取队头
int ListQueueTop(ListQueue *myQ,DataType *num)
{
if (myQ->front==NULL)
{
return 0;
}
*num = myQ->front->data;
return 1;
}
//销毁队列内存
void ListQueueDes(ListQueue **myQ)
{
ListQueue *temp,*pre;
if ((temp = (ListQueue*)malloc(sizeof(ListQueue))) == NULL)
{
exit(1);
}
pre = *myQ;
while (pre!=NULL)
{
temp = pre->front;
pre->front = pre->front->next;
free(temp);
temp = NULL;
}
(*myQ)->front = NULL;
(*myQ)->rear = NULL;
}
//主函数
int main()
{
ListQueue *Q;
int i,m;
DataType x;
ListQueueInit(&Q);
for ( i = 0; i < 10; i++)
{
if ((ListQueuePush(&Q, i + 1)) == 0)
{
printf("1error");
getchar();
return;
}
}
if ((ListQueueTop(&Q,&m))==0)
{
printf("2error");
getchar();
return;
}
else
{
printf("队头:%d\n", m);
}
/*while ((ListQueueNoEmpty(Q)) != 1)*/
i = 10;
while (i--)
{
if ((ListQueuePop(&Q,&x))==0)
{
printf("3error");
getchar();
return;
}
else
{
printf("%d ", x);
}
}
ListQueueDes(&Q);
getchar();
return 0;
}