本题要求实现一个函数,实现删除链表llist中的指定元素deldata。
函数接口定义:
void DelNode_Link(head, deldata);
其中head是操作的链表表头结点,deldata是待删除的元素。
裁判测试程序样例:
#include<stdio.h>
#include<stdlib.h>
typedef int DataType;
struct Node {
DataType data;
struct Node* next;
};
typedef struct Node *PNode;
typedef struct Node *LinkList;
LinkList SetNullList_Link()
{
LinkList head = (LinkList)malloc(sizeof(struct Node));
if (head != NULL) head->next = NULL;
else printf("alloc failure");
return head;
}
int IsNull_Link(LinkList llist)
{
return(llist->next == NULL);
}
void CreateList(struct Node* head)
{
PNode p = NULL;
PNode q = head; int data;
scanf("%d", &data);
while (data != -1)
{
p = (struct Node*)malloc(sizeof(struct Node));
p->data = data;
p->next = NULL;
q->next = p;
q = p;
scanf("%d", &data);
}
}
void DelNode_Link(head, deldata)
{
@@
}
void print(LinkList head)
{
PNode p = head->next;
while (p) {
printf("%d ", p->data);
p = p->next;
}
}
void DestoryList_Link(LinkList head)
{
PNode pre = head;
PNode p = pre->next;
while (p)
{
free(pre);
pre = p;
p = pre->next;
}
free(pre);
}
int main()
{
LinkList head = NULL;
PNode p = NULL;
int deldata;
head = SetNullList_Link();
CreateList(head);
scanf("%d", &deldata);
DelNode_Link(head, deldata);
print(head);
DestoryList_Link(head);
return 0;
}
输入样例:
1 5 10 15 20 -1
5
输出样例:
1 10 15 20
输入样例:
1 5 10 15 20 -1
2
输出样例:
not exist 2
1 5 10 15 20
void DelNode_Link(LinkList head, int deldata)
{
//定义一个指针current并初始化为链表的头节点。
PNode current = head;
//这个指针用于存储当前节点的前一个节点。
PNode prev = NULL;
//循环遍历链表,直到找到一个节点的数据等于deldata或者到达链表的末尾。
while (current != NULL && current->data != deldata){
//将prev指针指向当前节点。
prev = current;
//将current指针移动到下一个节点。
current = current->next;
}
// 检查是否找到了要删除的节点。如果没有找到,即current为NULL。
if (current == NULL) {
printf("not exist %d\n",deldata);
return;
}
//检查是否是头节点要被删除。
if (prev == NULL) {
//如果前一个节点是NULL(即头节点),则将头指针指向当前节点的下一个节点。
head = current->next;
} else {
// 如果不是头节点要被删除。
prev->next = current->next;
}
free(current);
}