2_单链表-查找删除

#include "stdio.h"
#include "stdlib.h"


#define OK 1
#define ERROR 0

typedef int ElemType;
typedef struct Lnode
{
    ElemType data;    // 数据域
    struct Lnode *next; // 指针域:指向自身的后继
}LNode, *LinkList;  // LNode等价于struct Lnode,LinkList等价于struct Lnode*

LinkList INIT_link(LinkList H); // 头指针
int Create_link(LinkList H);
int OUT_link(LinkList H);

int Search_link(LinkList H, int pos);
int Delete_link(LinkList H, int pos, ElemType *e); // 第三个参数是可选参数,用于返回主函数要删除的数
int Insert_link(LinkList H, int pos, ElemType e);


int main()
{
    LinkList head=NULL;  // 头指针为空
    int pos;
    ElemType e;
    int n;
    head = INIT_link(head);
    printf("输入数字,以-1结束:\n");
    Create_link(head);
    printf("\n输出为:\n");
    printf("\n");
    OUT_link(head);
    printf("\n输入要查找的位置:\n");
    scanf("%d", &pos);
    printf("这个位置的数是:\n");
    Search_link(head, pos);
    printf("\n输入要删除的位置:\n");
    scanf("%d", &pos);
    Delete_link(head, pos, &e);
    printf("\n输出为:\n");
    OUT_link(head);
    return OK;    // 运行成功,下同
}

LinkList INIT_link(LinkList H)    // 初始化链表,返回指针类型
{
    H = (LNode*)malloc(sizeof(LNode));  // 动态分配空间
    if(!H) return NULL;   // 空间分配失败就返回空
    H->next = NULL;   // 头指针设为空
    return H;
}

int Create_link(LinkList H)  // 创建指针
{
    LinkList p, tail=H;  // tail用于连接节点的指针
    ElemType m;
    int pos;
    int i;

    while(scanf("%d", &m)&&m!=-1)  // 以-1结束
    {
        p = (LNode*)malloc(sizeof(LNode));   // 分配空间,创建新的节点
        if(!p) return ERROR;
        p->data = m;       // 数据域
        p->next = NULL;    // 指针域

        tail->next = p;    // 连接下一个新节点
        tail = p;
    }
    return OK;

}

int OUT_link(LinkList H)
{
    LinkList p=H->next;
    if(H==NULL) return ERROR;   // 如果H为空就跳出
    while(p)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    return OK;
}


int Search_link(LinkList H, int pos)
{
    LinkList p=H->next;
    int i=1;
    if(H==NULL||pos<1) return ERROR;  // pos或H为空就返回0
    while(p&&i<pos)    // 一直寻找到pos的位置才跳出
    {
        i++;
        p = p->next;
    }
    if(p==NULL)     // 若p为空,证明不存在
        return ERROR;
    else
        printf("%d", p->data);
    return OK;
}

int Delete_link(LinkList H, int pos, ElemType *e)
{
    LinkList p=H->next,s;
    int i=1;
    if(H==NULL||pos<1) return ERROR;
    while(p&&i<pos-1)
    {
        i++;
        p = p->next;
    }
    if(p==NULL)
        return ERROR;
    s = p->next;     // 设置中间指定
    p->next = s->next;  // 把要连接删除的那个节点值指针指向删除节点指针的下一个

    *e = s->data;
    free(s);    // 释放
    return OK;
}

在这里插入图片描述

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值