赞
踩
题目如下:
裁判测试程序样例:
- #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;
- }
-
- /* 你的代码将被嵌在这里 */
代码如下:
- struct ListNode *readlist()
- {
- struct ListNode *head, *p1, *p2;//创建指针变量
- int n = 0; //创建整型变量
- head = NULL; //初始化
- scanf("%d", &n); // 读取第一个整数
-
- while (n != -1) // 当整数不等于 -1 时
- {
- p1 = (struct ListNode *)malloc(sizeof(struct ListNode)); // 为新节点分配内存
- p1->data = n; // 将整数值存储到新节点的 data 字段
-
- if (head == NULL) // 如果链表为空
- {
- head = p1; // 设头指针为 p1
- p2 = p1; // 设 p2 为 p1
- }
- else
- {
- p2->next = p1; // 在链表尾部添加新节点
- p2 = p1; // 更新指针 p2 以指向新添加的节点
- }
- scanf("%d", &n); // 再次读取一个整数
- }
-
- p2->next = NULL; // 将链表尾部设置为 NULL
- return head; // 返回链表头指针
- }
-
- //删除数值等于m的节点
- struct ListNode *deletem(struct ListNode *L, int m)
- {
- //指针L指向链表头
- struct ListNode *p1, *p2 = NULL, *a;
- p1 = L;//初始化为链表头指针
- while (p1 != NULL)//p1用于遍历链表,p2用于跟踪遍历过程中p1的前一个结点
- {
- if (p1->data == m)
- {
- if (p2 == NULL)//即p1为链表的头结点
- {
- L = p1->next;//使头指针指向p1->next
- a = p1;//用a来释放
- p1 = p1->next;
- free(a);
- }
- else//p1 不是头节点
- {
- p2->next = p1->next;//将p2->next更新为p1->next以删除当前节点p1
- a = p1;
- p1 = p1->next;
- free(a);
- }
- }
- else
- {
- p2 = p1;
- p1 = p1->next;
- }
- }
- return L;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。