PTA函数最后一题:链表删除节点

链表删除节点
(第一次写,打字都有点不太利索)
上代码:
#include <stdio.h>
#include <stdlib.h>

struct ListNode {//定义链表
int data;
struct ListNode* next;
};

struct ListNode* readlist();
struct ListNode* deletem(struct ListNode* L, int m);
void printlist(struct ListNode* L)//输出
{
struct ListNode* p = L;
while § {
printf("%d “, p->data);
p = p->next;
}
printf(”\n");
}

int main()
{
int m;
struct ListNode* L = readlist();
scanf("%d", &m);
L = deletem(L, m);
printlist(L);

return 0;

}
struct ListNode* readlist()
{
struct ListNode* head, * tail, * p;
head = tail = NULL;//head为空用于判断初值,tail为零用于链表结束
while (1)
{
p = (struct ListNode*)malloc(sizeof(struct ListNode));
scanf("%d", &(p->data));

    if (p->data < 0)//输入小于零时结束
        break;
    p->next = NULL;//由于链表顺序与插入顺序相同,故每读入一项都要使下一项指向空
    if (head == NULL)//对链表赋初值(头节点)
        head = p;
    else tail->next = p;//将链表读入
    tail = p;//尾指针后移
}
return head;

}
struct ListNode* deletem(struct ListNode* L, int m)
{
struct ListNode* p, * q; //p为要删除结点的前一结点,q为要删除的结点
while (L != NULL && L->data == m) //在链表不为空时判断链表的头结点是否是要删除的元素
{
q = L;
L = L->next;
free(q);
}
if (L == NULL) //判断链表是否为空
{
return NULL;
}

//删除头结点后指定的结点
p = L;                //p为要删除结点的前一结点
q = L->next;          //q为要删除的结点
while (q != NULL)      //遍历头结点后的结点
{
    if (q->data == m)//找到指定结点,删除该结点后,q指针指向删除结点的后一结点,p不变
    {
        p->next = q->next;
        free(q);
        q = p->next;
    }
    else         //未找到该节点,p,q指针均向后移一个结点
    {
        p = q;
        q = q->next;
    }
}
return L;

}
原本在判断那一步我用的是for循环,后来发现两种情形下条件不一样
希望能有所帮助

猜你喜欢

转载自blog.csdn.net/weixin_51235620/article/details/111385823