您的位置:首页 > 其它

用头插、尾插、按顺序插入创建一个不带头节点的链表,栈的基本操作

2014-06-09 18:41 701 查看
#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;

}

栈的存储结构有两种:一种是线性栈,一种是链式栈。下面分别是这两种存储结构的实现。
线性栈:

[cpp] view
plaincopy





#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;

}

链式栈:

[cpp] view
plaincopy





#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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐