单链表删除某个节点

#include 
#include 
//单链表头插

//定义节点类型
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;
}

你可能感兴趣的:(C语言数据结构,c,数据结构)