链表删除节点
上代码:
#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循环,后来发现两种情形下条件不一样
希望能有所帮助