删除链表奇数元素

/*
功能:
    删除队列中的奇数元素
思路:
    队列是先进先出,前面删除后面插入的了,所以呢
    我们就从前面开始,删除,偶数的话就插到队尾,奇数就不管咯
    结束条件呢,就是原来的队尾都删除了吧
*/

// 如果要用链队好了
#include<stdlib.h>
#include<stdio.h>

typedef struct qnode
{
    int data;
    struct qnode *next;
} QNode;

typedef struct
{
        QNode *front;
        QNode *rear;
} QList;

// 打印队列
void show(QList *q)
{
    QNode * head = q->front;
    if(q->rear == NULL)
    {
        printf("NULL\n");

    }
    else{
        while(head!=q->rear->next)
        {
            printf("%d ", head->data);
            head = head->next;
        }
        printf("\n");
    }

}
// 进队
void enQueue(int val, QList *q)
{
    QNode *s;
    s = (QNode *)malloc(sizeof(QNode));
    s->data = val;
    s->next = NULL;
    if(q->rear ==NULL) //链队为空,新节点是对首也是队尾
        q->front = q -> rear = s;
    else
    {
        q->rear ->next = s;
        q->rear = s;
    }
}

int deQueue(QList *q)
{
    QNode *t;
    if(q->rear == NULL)//空
    return 0;
    t = q->front;
    if(q->front == q -> rear) //一个节点
        q->front = q->rear = NULL;
    else
        q ->front = q->front->next; //多个节点
    free(t);
     return 0;

}
// 初始化
QList * init()
{
    QList * q = (QList *)malloc(sizeof(QList));
    q->front = q->rear = NULL;
    return q;
}

int deleteodd(QList *q)
{
         QNode * begin;
        QNode * end = q->rear;
        if(q->rear==NULL)//为空就不处理了
            return 0;
        begin = q->front;
        end = q->rear;
        while(begin!=end)
        {
           // int data = begin->data;
           begin = q->front;
            if( begin->data%2==0) //偶数
            {
               // deQueue(q);
              //  enQueue(data,q);

                  // 不出队入队
                  if(q->front == q->rear) //反正要保留,不需要问是不是空,如就一个元素,就会直接跳出循环了
                    break;
                else
                {
                    q->front = q->front->next; //头往后移
                    begin->next = NULL; //当前节点呢,就尾插法插入链表
                   q-> rear->next = begin; // 尾指针后移
                   q-> rear = begin;
                }
            }
            else
            {
                    QNode *t;
                    t = q->front;
                    if(q->front == q -> rear) //一个节点
                        q->front = q->rear = NULL;
                    else
                        q ->front = q->front->next; //多个节点
                    free(t);
                    //deQueue(q);
            }

        }
        return 0;

}

int main()
{
    int i;
    int n;
   // --------------创建链表开始
    printf("num:");
    scanf("%d",&n);

    QList *q = init();
    for(i = 0;i<n;i++)
    {
        int val;
        scanf("%d",&val);
        enQueue(val,q);
    }
    printf("原始的\n");
    show(q);
    //---------------创建结束


    // -------------删除 看着一个函数就行了   我把所有的功能能挪到一个函数了
    deleteodd(q);
    //-------------  显示
    show(q);
     return 0;
}


版权声明:本文为github_30830155原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。