在删除节点数据函数中填空,首先建立整数链表,然后删除所有与指定的数相等的结点。如果原链表中找不到要删除的数,就什么也不做。 (提示:使用结构体数据)
#include <stdio.h>
#include <stdlib.h>
struct Link *AppendNode(struct Link *head);
void DispLink(struct Link *head);
void freenoheadlist(struct Link *h);
struct Link
{
int data;
struct Link *next;
};
//函数功能:从head指向的链表中删除所有节点数据为nodeData的节点。注意:该链表不带头结点
//函数返回删除节点后的链表的头节点指针
struct Link *DeleteNode(struct Link *head, int nodeData)
{
//在这里补充代码
}
int main()
{
int i = 0,data1,n;
struct Link *head = NULL; //指向链表头
scanf("%d",&n);
for(i=1;i<=n;i++)
head = AppendNode(head);
scanf("%d",&data1);
head = DeleteNode(head, data1);
DispLink(head);
freenoheadlist(head);
return 0;
}
//函数功能:释放链表空间
void freenoheadlist(struct Link *h)
{
struct Link *t;
while (h)
{
t=h->next;
free(h);
h=t;
}
}
//函数功能:新建一个节点,并将该节点添加到链表的末尾,返回添加节点后的链表的头节点指针
struct Link *AppendNode(struct Link *head)
{
struct Link *p = NULL;
struct Link *pr = head;
int data;
p = (struct Link *)malloc(sizeof(struct Link)); //为新节点申请内存
if (p == NULL) //若申请内存失败,则打印错误信息,退出程序
{
exit(0);
}
if (head == NULL) //若原链表为空表,则将新建节点置为首节点
{
head = p;
}
else //若原链表为非空,则将新建节点添加到表尾
{
//若未到表尾,则继续移动指针pr,直到pr指向表尾
while (pr->next != NULL)
{
pr = pr->next;
}
pr->next = p; //将新建节点添加到链表的末尾
}
pr = p; //让pr指向新建节点
scanf("%d", &data); //输入节点数据
pr->data = data;
pr->next = NULL; //将新建节点置为表尾
return head; //返回添加节点后的链表的头节点指针
}
//函数功能:显示所有已经建立好的节点的节点号和该节点中数据项内容
void DispLink(struct Link *head)
{
struct Link *p = head;
while (p != NULL) //若不是表尾,则循环打印
{
printf("%d\n", p->data); //打印第j个节点的数据
p = p->next; //让p指向下一个节点
}
}