- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #define N 10
- typedef struct Node
- {
- int data;
- struct Node *next;
- }Node, *pNode;
- /*尾插法*/
- void create_list_rear(pNode *h)
- {
- srand(time(NULL));
- pNode p, q;
- p = q = *h = (pNode)calloc(1,sizeof(Node));
- p->next = NULL;
- int count = 0;
- while (count!=N){
- ++count;
- if (count == 1){
- p->data = rand()%100;
- printf("%d ", p->data);
- }
- else{
- p = (pNode)calloc(1, sizeof(Node));
- p->data = rand() % 100;
- printf("%d ",p->data);
- p->next = NULL;
- q->next = p;
- q = p;
- }
- }
- printf("\n");
- }
- /*头插法*/
- void create_list_front(pNode *h)
- {
- pNode p;
- p = *h = (pNode)calloc(1,sizeof(Node));
- p->next = NULL;
- int count = 0;
- while (count != N){
- ++count;
- if (count == 1){
- p->data = rand() % 100;
- printf("%d ", p->data);
- }
- else {
- p = (pNode)calloc(1,sizeof(Node));
- p->data = rand() % 100;
- printf("%d ", p->data);
- p->next = *h;
- *h = p;
- }
- }
- printf("\n");
- }
- /*顺序插入法*/
- void create_list_sequence(pNode *h)
- {
- pNode p, q, r=NULL;
- p = q = *h = (pNode)calloc(1,sizeof(Node));
- p->next = NULL;
- int count = 0;
- while (count != N){
- ++count;
- if (count == 1){
- p->data = rand()%100;
- printf("%d ", p->data);
- }
- else{
- r = (pNode)calloc(1,sizeof(Node));
- r->data = rand() % 100;
- printf("%d ", r->data);
- p = q = *h;
- while (p ->next != NULL && p->data < r->data ){
- q = p;
- p = p->next;
- }
- if (p->data >= r->data){
- if (p == q){
- r->next = *h;
- *h = r;
- }
- else {
- r->next = p;
- q->next = r;
- }
- }
- else{
- p->next = r;
- r->next = NULL;
- }
- }
- }
- printf("\n");
- }
- void printList(pNode h)
- {
- while (h != NULL){
- printf("%d ",h->data);
- h = h->next;
- }
- printf("\n");
- }
- int main()
- {
- pNode List = NULL;
- /*尾插法*/
- printf("尾插法:原数列的顺序为:\n");
- create_list_rear(&List);
- printf("链表的顺序为:\n");
- printList(List);
- /*头插法*/
- printf("头插法:原数列的顺序为:\n");
- create_list_front(&List);
- printf("链表的顺序为:\n");
- printList(List);
- /*顺序插法*/
- printf("顺序插法:原数列的顺序为:\n");
- create_list_sequence(&List);
- printf("链表的顺序为:\n");
- printList(List);
- return 0;
- }
栈的存储结构有两种:一种是线性栈,一种是链式栈。下面分别是这两种存储结构的实现。
线性栈:
- #define STACK_INIT_SIZE 10
- #define STACK_REALLOCATION 2
- typedef int ElemType;
- typedef struct SqStack
- {
- ElemType *base;
- int top;
- int stacklength;
- }SqStack;
- void InitSqStack(SqStack *S)
- {
- S->base = (ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));
- if (!S->base)
- exit(1);
- S->top = 0;
- S->stacklength = STACK_INIT_SIZE;
- }
- void Push_SqStack(SqStack *S,ElemType e)
- {
- if (S->top == S->stacklength){
- S->base = (ElemType*)realloc(S->base,(S->stacklength
- +STACK_REALLOCATION)*sizeof(ElemType));
- if (!S->base)
- exit(1);
- S->stacklength += STACK_REALLOCATION;
- }
- S->base[S->top] = e;
- ++S->top;
- }
- int Pop_SqStack(SqStack *S, ElemType *e)
- {
- if (S->top == 0)
- return 0;
- --S->top;
- *e = S->base[S->top];
- return 1;
- }
- int GetTopElem_SqStack(SqStack *S, ElemType *e)
- {
- if (S->top == 0)
- return 0;
- *e = S->base[S->top-1];
- return 1;
- }
- int isSqStackEmpty(SqStack S)
- {
- if (S.top == 0)
- return 1;
- else
- return 0;
- }
- void SqStack_test()
- {
- SqStack S;
- InitSqStack(&S);
- ElemType e;
- printf("Please input some numbers(Ctrl + Z to end).\n");
- while (scanf("%d", &e) != EOF)
- Push_SqStack(&S,e);
- printf("The out stack sequence is:\n");
- while (!isSqStackEmpty(S)){
- Pop_SqStack(&S,&e);
- printf("%d ",e);
- }
- printf("\n");
- }
- int main()
- {
- SqStack_test();
- return 0;
- }
链式栈:
- #include <stdio.h>
- #include <stdlib.h>
- #define STACK_INIT_SIZE 10
- #define STACK_REALLOCATION 2
- typedef int ElemType;
- typedef struct LinkStack
- {
- ElemType data;
- struct LinkStack *next;
- }StackNode,*StackPNode;
- StackPNode InitLinkStack()
- {
- StackPNode head = (StackPNode)malloc(sizeof(StackNode));
- if (!head)
- exit(1);
- head->next = NULL;
- head->data = 0;
- return head;
- }
- void Push_LinkStack(StackPNode head, ElemType e)
- {
- StackPNode node = (StackPNode)malloc(sizeof(StackNode));
- if (!node)
- exit(1);
- node->data = e;
- node->next = NULL;
- node->next = head->next;
- head->next = node;
- }
- int Pop_LinkStack(StackPNode head, ElemType *e)
- {
- StackPNode p;
- if (!head->next)
- return 0;
- //StackPNode p;
- //StackPNode p;
- //struct LinkStack *p;
- p= head->next;
- *e=p->data;
- head->next = p->next;
- free(p);
- return 1;
- }
- int isLinkStackEmpty(StackPNode head)
- {
- if (head->next)
- return 0;
- else
- return 1;
- }
- int getTopElem_LinkStack(StackPNode head,ElemType *e)
- {
- if (head->next)
- return 0;
- *e = head->next->data;
- return 1;
- }
- void LinkStack_test()
- {
- StackPNode head = InitLinkStack();
- ElemType e;
- printf("Please input some numbers(Ctrl + Z to end).\n");
- while (scanf("%d", &e) != EOF)
- Push_LinkStack(head,e);
- printf("The out stack sequence is:\n");
- while (!isLinkStackEmpty(head)){
- Pop_LinkStack(head, &e);
- printf("%d ", e);
- }
- printf("\n");
- }
- int main()
- {
- LinkQueueTest();
- return 0;
- }