线性表练习1

已知线性表的元素递增有序,并以带头结点的单链表作存储结构,设计一个高效算法,删除表中所有大于mink且小于maxk的元素。

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

//自定义,最后一定要加分号
//typedef int Elemtype;

typedef struct Node
{
    int data;
    //这里struct结构体标识符别掉了
    struct Node *next;
}Node;

//此类型是结构体指针,别把*写掉了
typedef struct Node* Linklist;

//初始化链表
void InitList(Linklist *l)
{
    (*l) = (Linklist)malloc(sizeof(Node));
    if(!(*l))
    {
        printf("初始化失败!\n");
        exit(1);
    }
    (*l)->next = NULL;
    printf("初始化成功!\n");
}
//尾插法建立链表
void CreateList(Linklist *l,int n)
{
    int j,i = 0;
    Linklist p,temp;
    temp = (*l);
    while(i<n)
    {
        i++;
        //注意分配的是Node大小的空间不是int大小
        p = (Linklist)malloc(sizeof(Node));
        if(!p)
        {
            printf("创建失败!\n");
            exit(1);
        }
        p->next = NULL;
        printf("请输入你要跳入表中的第%d个数:\n",i);
        scanf("%d",&j);
        //注意先输入值再赋值给p->data
        p->data = j;
        temp->next = p;
        temp = p;
    }
    printf("创建成功!\n");
}

void Delete(Linklist *l,int mink,int maxk)
{
    Linklist pre,p,q,s;
    pre = (*l);
    p = (*l)->next;
    while(p!=NULL&&(p->data<mink||p->data==mink))
    {
        pre = p;
        p = p->next;
    }
    if(p)
    {
        while(p!=NULL&&p->data<maxk)
            p = p->next;
       //修改指针
        q = pre->next;
        pre->next = p;
        //释放pre到p之间的节点空间
        while(q!=p)
        {
            s = q->next;
            free(q);
            q = s;
        }

    }
    printf("删除成功!\n");
}

void PrintList(Linklist *l)
{
    Linklist p;
    int j,i = 0;
    p = (*l)->next;
    printf("*******************打印整个链表***********************\n");
    if(p==NULL)
    {
        printf("这是一个空链表!\n");
    }
    while(p)
        {
            i++;
            j = p->data;
            printf("第%d个节点的数据为:%d\n",i,j);
            p = p->next;
        }
}

int main()
{
    int n = 5;
    int mink = 2;
    int maxk = 6;
    Linklist la;
    InitList(&la);
    CreateList(&la,n);
    PrintList(&la);
    Delete(&la,mink,maxk);
    PrintList(&la);
    return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值