单链表、链表队列、循环队列、栈

/*

//    链表

#include "stdio.h"

#include "stdlib.h"

typedef struct node{

    int value;

    struct node *next;

}pnode;

pnode* create()

{

    pnode *head,*last,*p;

    int num;

    head=last=NULL;

    printf("input data:\n");

    while((scanf("%d",&num))==1)

    {

        p=(pnode *)malloc(sizeof(pnode));

        p->value=num;

        p->next=NULL;

        if(head==NULL)

        {

            head=last=p;

        }else{

            last->next=p;

            last=last->next;

        }

    }

    return head;

}

void search(pnode *head)

{

    pnode *p;

    p=head;

    while (p) {

        printf("%d",p->value);

        p=p->next;

    }

}

pnode * insert(pnode *head)

{

    pnode *p,*q = NULL;

    p=head;

    int data;

    int a=2;

    getchar();

    printf("input insert data:");

    scanf(" %d",&data);

    pnode *new=(pnode *)malloc(sizeof(pnode));

    new->value=data;

    if(head==NULL)

    {

        head=new;

        new->next=NULL;

    }

    if(head->value==a)

    {

        new->next=head;

        head=new;

    }else{

        while (p->value!=a&&p->next!=NULL)

        {

            q=p;

            p=p->next;

        }

        if(p->value==a)

        {

            new->next=p;

            q->next=new;

            

        }else{

            q->next=new;

            new->next=NULL;

        }

    }

    return head;

}

pnode *delete(pnode *head)

{

    pnode *p,*q;

    p=head;

    q=NULL;

    int data;

    printf("input delete data:");

    scanf(" %d",&data);

    if(head!=NULL)

    {

        if(head->value==data)

        {

            free(head);

            head=NULL;

        }else{

            while (p->value!=data&&p->next!=NULL) {

                q=p;

                p=p->next;

            }

            if(p->value==data)

            {

                q->next=p->next;

                free(p);

            }else{

                printf("the data is not exit in the node\n");

            }

        }

        

    }else{

        printf("the node is null!");

    }

    return head;

}

int main()

{

    pnode *head;

    head=create();

    search(head);

    printf("\n");

    insert(head);

    search(head);

    printf("\n");

    delete(head);

    search(head);

    return 0;

}

 */

/*


//link队列

#include "stdio.h"

#include "stdlib.h"

typedef struct Queue{

    int data;

    struct Queue *next;

}Queue;

typedef struct pointer{

    Queue *front;

    Queue *rear;

}Qpointer;

void creatQueue(Qpointer *qp)

{

    Queue *que=(Queue *)malloc(sizeof(Queue));

    que->next=NULL;

    qp->rear=qp->front=que;

    printf("createQueue success!\n");

}

int isEmpty(Qpointer *qp)

{

    if(qp->front==qp->rear)

    {

        return 1;

    }

    return 0;

}

void QueuePush(Qpointer *qp)

{

    int data;

    printf("input push data:\n");

    while ((scanf("%d",&data))==1) {

        Queue *q=NULL;

        q=(Queue *)malloc(sizeof(Queue));

        if(q==NULL)

        {

            printf("malloc failed!\n");

            exit(-1);

        }

        q->data=data;

        q->next=NULL;

        qp->rear->next=q;

        qp->rear=q;

    }

}

void QueuePop(Qpointer *qp)

{

    Queue *q;

    int data;

    if(isEmpty(qp))

    {

        printf("Queue is null!\n");

        exit(-1);

    }

    q=qp->front->next;

    data=q->data;

    qp->front->next=q->next;

    if(qp->rear==q)

    {

        qp->rear=qp->front;

    }

    printf("the pop data is %d\n",q->data);

    free(q);

    q=NULL;

}

void freeQueue(Qpointer *qp)

{

    Queue *q=qp->front->next;

    while (q!=NULL) {

        q=qp->front->next;

        QueuePop(qp);

        

    }

    qp=NULL;

}

void selectQueue(Qpointer *qp)

{

    Queue *q;

    if(isEmpty(qp))

    {

        printf("queue is null!\n");

    }else{

        q=qp->front->next;

        printf("the data of queue:\n");

        while (q) {

            printf("%d\t",q->data);

            q=q->next;

        }

    }

    printf("\n");

}

int main()

{

    

    Qpointer *qp;

    qp=(Qpointer *)malloc(sizeof(Qpointer));

    creatQueue(qp);

    selectQueue(qp);

    QueuePush(qp);

    selectQueue(qp);

    QueuePop(qp);

    selectQueue(qp);

    freeQueue(qp);

    selectQueue(qp);

    return 0;

}

 */

/*

//循环队列

#include "stdio.h"

#include "stdlib.h"

#define QueueNum 10

typedef int QueElemType;

typedef struct Queue{

    QueElemType *base;

    int front;

    int rear;

}SqQueue;

void initQueue(SqQueue *que)

{

    que->base=(QueElemType *)malloc(sizeof(QueElemType)*QueueNum);

    if(!que->base)

    {

        printf("init Queue failed!\n");

        exit(-1);

    }else{

        que->front=que->rear=0;

        printf("init Queue success\n");

    }

    

}

int isEmpty(SqQueue *que)

{

    if(que->front==que->rear)

    {

        return 1;

    }

    return 0;

}

int isFull(SqQueue *que)

{

    if((que->rear+1)%QueueNum==que->front)

    {

        return 1;

    }

    return 0;

}

void pushQueue(SqQueue *que)

{

    QueElemType element;

    printf("input push element:\n");

    while ((scanf("%d",&element))==1) {

        if (isFull(que)) {

            printf("the queue is full!\npush failed!\n");

            break;

        }else{

            *(que->base+que->rear)=element;

            que->rear=(que->rear+1)%QueueNum;

        }


    }


}

void visitQueue(SqQueue *que)

{

    if(isEmpty(que))

    {

        printf("the Queue is null!\n");

    }else{

        printf("the element of Queue is:\n");

        int n=que->front;

        while (n!=que->rear) {

            printf("%d\t",*(que->base+n));

            n=(n+1)%QueueNum;

        }

    }

    printf("\n");

}

void popQueue(SqQueue *que)

{

    QueElemType element;

    if(isEmpty(que))

    {

        printf("the Queue is null!\n");

    }else{

        element=que->base[que->front];

        que->front=(que->front+1)%QueueNum;

    }

    printf("the pop element is %d.\n",element);

}

void freeQueue(SqQueue *que)

{

    while (que->front!=que->rear) {

        popQueue(que);

    }

}

int main()

{

    SqQueue *p;

    initQueue(p);

    pushQueue(p);

    visitQueue(p);

    popQueue(p);

    visitQueue(p);

    freeQueue(p);

    visitQueue(p);

    return 0;

}

*/

#include "stdio.h"

#include "stdlib.h"

#define StackNum 10

typedefint ElementType;

typedef struct{

   ElementType *base;

    ElementType *top;

   int size;

}Stack;

void initStack(Stack *st)

{

    st->base=(ElementType *)malloc(sizeof(ElementType)*StackNum);

   if(!st->base)

    {

        printf("init Stack failed!\n");

       exit(-1);

    }

    st->top=st->base;

    st->size=StackNum;

    printf("init Stack success!\n");

}

int isEmpty(Stack *st)

{

   if(st->top==st->base)

    {

       return 1;

    }

   return 0;

}

void pushStack(Stack *st)

{

   ElementType element;

   if((st->top-st->base)>=(st->size))

    {

        st->base=(ElementType *)realloc(st->base, (st->size+StackNum)*sizeof(ElementType));

       if(!st->base)

        {

            printf("push stack failed!\nrealloc errror!\n");

           exit(-1);

        }

        st->top=st->base+st->size;

        st->size+=StackNum;

    }

    printf("input stack element:\n");

   while ((scanf("%d",&element))==1) {

        *(st->top)=element;

        st->top++;

    }

}

void popStack(Stack *st)

{

   ElementType element;

   if(isEmpty(st))

    {

        printf("the stack is null!\n");

    }else{

        element=*--st->top;

        st->size--;

    }

}

void visitStack(Stack *st)

{

   int i=0;

   if(!isEmpty(st))

    {

       for(i=0;i<st->size;i++)

        {

           printf("%d\t",*(st->base+i));

        }

    }

   printf("\n");

}

int main()

{

   Stack *st;

   initStack(st);

   pushStack(st);

    visitStack(st);

   popStack(st);

    visitStack(st);

   return 0;

}

头歌C语言单链表循环队列是一种使用单链表实现的循环队列数据结构。它具有如下特点: 首先,它使用一个带有头节点的单链表来存储队列中的元素,头节点用于标识队列的头部位置。 其次,队列的尾部指针rear指向链表的最后一个节点,用于指示下一个元素应该插入的位置。 循环队列的实现可以通过使尾指针rear指向头节点的前一个节点,从而形成一个闭环,实现循环的效果。这样在插入和删除元素时,只需修改尾指针rear即可。 当队列为空时,头指针和尾指针都指向头节点。当队列满时,尾指针指向链表的最后一个节点,头指针指向第一个元素。 插入元素操作时,首先判断队列是否已满,如果满则无法插入;否则,创建一个新节点,将数据插入到新节点的数据域中,然后将新节点插入到链表尾部,修改尾指针rear指向新节点。 删除元素操作时,首先判断队列是否为空,如果为空则表示无法删除;否则,删除头节点的下一个节点,并将头指针指向新的头节点。 通过以上方式,循环队列可以不断处理新元素,并保持队列的大小固定。 总之,头歌C语言单链表循环队列是一种基于单链表实现的循环队列,它通过头节点和尾指针来标识队列的头部和尾部位置,通过修改尾指针来实现循环操作。它具有简单高效的特点,适用于需要频繁进行插入和删除操作的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值