单链表删除所有值大于x而不大于y的结点

单链表删除所有值大于x而不大于y的结点

lixiangrong
2024-01-29 / 0 评论 / 42 阅读 / 正在检测是否收录...

单链表删除所有值大于x而不大于y的结点

#include <stdio.h>
#include <stdlib.h>

typedef int dataType;

// 单链表
typedef struct linkNode
{
    dataType data;
    struct linkNode *next;
}node,*linkList;

// 1.初始化不带头结点的单链表
void init(linkList *list)
{
    *list = NULL; // 表示链表指针指向空处
}

// 2.输出单链表元素
void display(linkList list)
{
    node *p = list; // p为工作指针,初值为头指针
    if(!p)
    {
        printf("链表为空!\n");
        return;
    }
    else
    {
        while (p)
        {
            printf("%d ",p->data);
            p = p->next;
        }
    }
    printf("\n");
}

// 3.在单链表尾部插入元素
void rearInsert(linkList *list, dataType x)
{
    node *p = *list,*q; // p初值为当前链表指针指向的结点
    q = (node*)malloc(sizeof(node)); // 创建新节点
    q->data = x;
    q->next = NULL; // 新节点的指针域置空
    if(!p)
        *list = q; // 如果当前链表为空
    else
    {
        while (p->next) // 找到最后一个结点
            p = p->next;
        p->next = q;
    }
}

// 3.8.8 删除所有值大于x而不大于y的结点
void del(linkList *list, dataType x, dataType y)
{
    node *p = *list,*q,*pre; // p为工作指针,pre为前驱结点指针
    if(!p)
    {
        printf("链表为空!\n");
        return;
    }
    while (p)
    {
        if(p->data > y) // 有序链表,当值超过边界则退出循环
            break;
        if(p->data > x && p->data <= y)
        {
            if(p == *list) // 如果要删除的是第一个结点
                *list = p->next;
            else
                pre->next = p->next;
            q = p;
            p = p->next;
            free(q); // 释放空间
        } else
        {
            pre = p; // 使前驱结点指针指向当前结点
            p = p->next; // 向后遍历
        }
    }
}

int main()
{
    linkList list; // 声明一个指向链表的指针,即头指针
    init(&list); // 初始化链表
    for (int i = 1; i <= 10; i++) // 循环插入结点
        rearInsert(&list,i);
    display(list); // 输出链表
    dataType x = 2,y = 6;
    printf("删除所有值大于%d而不大于%d的结点\n",x,y);
    del(&list,x,y);
    display(list); // 输出链表
    return 0;
}
0

评论 (0)

取消