本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中所有存储了某给定值的结点删除。链表结点定义如下:
struct ListNode {
int data;
ListNode *next;
};
函数接口定义:
struct ListNode *readlist();
struct ListNode *deletem( struct ListNode *L, int m );
函数readlist
从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−1时表示输入结束,函数应返回指向单链表头结点的指针。
函数deletem
将单链表L
中所有存储了m
的结点删除。返回指向结果链表头结点的指针。
裁判测试程序样例:
#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 (p) {
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;
}
/* 你的代码将被嵌在这里 */
输入样例:
10 11 10 12 10 -1
10
结尾无空行
输出样例:
11 12
结尾无空行
我的代码:
struct ListNode *readlist()
{
//头节点,内部不存有用数据,便于链表的后期处理(可以不加,但是要修改后面的处理结构)
struct ListNode *input=(struct ListNode *)calloc(1,sizeof(struct ListNode));
//指针,指向要处理的节点
struct ListNode *temp=input;
//首元节点,储存第一个有用的数据
struct ListNode *p=(struct ListNode *)calloc(1,sizeof(struct ListNode));
p->next=NULL;//当前最后一个节点的下一个节点必须是NULL,不然后期不好查找链表的长度
temp->next=p;//将头节点和首元节点连接起来
temp=temp->next;//让指针移动到首元节点
scanf("%d",&temp->data);//向首元节点输入data
while(1){
//建立新节点
struct ListNode *p=(struct ListNode *)calloc(1,sizeof(struct ListNode));
p->next=NULL;//新节点的下一个节点为NULL,原因同上
scanf("%d",&p->data);//向新节点输入数据
if(p->data!=-1){
temp->next=p;//将新节点接入链表
temp=temp->next;//指针指向新的节点
}else{
free(p);//删除新节点
break;
}
}
return input;
}
struct ListNode *deletem( struct ListNode *L, int m )
{
struct ListNode *temp=L;//指针,指向要处理的节点
while(temp->next!=NULL){//链表处理完毕则退出循环
if(temp->next->data==m){//如果当前处理的节点的下一节点的data为m,则删除下一个节点
struct ListNode *del=temp->next;//标记待删除的节点
temp->next=temp->next->next;//链表绕过待删除的节点
free(del);//删除待删除的节点
}else{
temp=temp->next;
}
}
struct ListNode *del=L;//标记头节点
L=L->next;//链表绕过头节点
free(del);//删除头节点
return L;
}
仅供参考