单链表删除某个节点

#include <stdio.h>
#include <stdlib.h>
//单链表头插

//定义节点类型
typedef struct LNode {
    int data;//数据域
    struct LNode *next;//指针域
} LNode, *LinkList;

void headList(LinkList &l) {//LinkList等价LNode*(结构体指针)
    l = (LinkList) malloc(sizeof(LNode));
    l->next = NULL;
    int x;
    scanf("%d", &x);
    LinkList s;
    while (x != 9999) {
        s = (LinkList) malloc(sizeof(LNode));
        s->data = x;
        //最后两步顺序不能换
        s->next = l->next;
        l->next = s;
        scanf("%d", &x);
    }
}

void tailList(LinkList &l) {
    l = (LinkList) malloc(sizeof(LNode));
    l->next = NULL;
    int x;
    scanf("%d", &x);//s指向新节点,r指向链表尾
    LinkList s, r = l;
    while (x != 9999) {
        s = (LinkList) malloc(sizeof(LNode));//s存储了这个节点的起始地址.s指向此节点
        s->data = x;
        r->next = s;//新节点给尾节点next指针
        r = s;//r指向新的尾部
        scanf("%d", &x);
    }
    r->next = NULL;
}

//void printList(LinkList l) {
//    l = l->next;
//    while (l != NULL) {
//        printf("%3d", l->data);
//        l = l->next;
//    }
//}
void printList(LinkList L) {
    L = L->next;
    while (L != NULL) {
        printf("%d", L->data);//打印当前结点数据
        L = L->next;//指向下一个结点
        if (L != NULL) {
            printf(" ");
        }
    }
    printf("\n");
}

LinkList getByLoxation(LinkList l, int pos) {
    int i = 1;
    l = l->next;
    while (l && i < pos) {
        l = l->next;
        i++;
    }
    return l;
}

bool listDelete(LinkList l, int i) {
    LinkList p;
    LinkList q;
    if (i < 1) {
        return false;
    } else {
        p = getByLoxation(l, i - 1);
        q = p->next;//存被删除节点的指针,方便后续free
        if (q == NULL) {
            return false;
        }
        p->next = q->next;
        free(q);
        return true;
    }
};

int main() {
    LinkList l;
//    headList(l);
//    printList(l);
    tailList(l);
    bool res = listDelete(l, 4);
    if (res) {
        printList(l);
    }else {
        printf("false");
    }
    return 0;
}

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值