s99q


私信TA

用户名:20206805

访问量:2019

签 名:

等  级
排  名 361
经  验 3312
参赛次数 0
文章发表 76
年  龄 0
在职情况 学生
学  校 中大
专  业

  自我简介:

解题思路:

创建两个链表,首先是每个内部没有重复的值,但是在不同的链表之间有重复的值,因此只要判定有一个相同,就可以判断第一个链表的下一个节点
对应有n个节点的那个);在进行判断时要注意,使用while循环


注意事项:

1:如下的代码中
2:不要将m和n的位置弄乱了

参考代码:

/*为了方便头指针的使用,在下面的代码中先申请head的空间,然后就对head对应的值进行赋初值*/
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>

typedef struct stu
{
	int serial_number;
	int score;
	struct stu* next;
}*stu0, stu1;

int main()
{
	int n, m, i = 0, j = 1;             
	//j的作用:用来判断是否在一次外循环中找到了要删除的对象,在这里将j赋初值为1是
	//因为在下面的代码中,当进行了删除后将会把p推进1(p和q均是结构体指针,在本题中我
	//以p为先,q为后),因而就不执行下面的p=向前推进1了    
	//n表示的是第一个链表的节点个数,m表示的是第二个的
	scanf("%d%d", &n, &m);
	stu0 head0 = (stu0)malloc(sizeof(stu1)), head1 = (stu0)malloc(sizeof(stu1)), p = NULL, q = NULL, pq = NULL;   
	//习惯上以前为先即p
	if (head0 == NULL || head1 == NULL)           
	//判断是否有足够的空间,没有则退出
	{
		printf("There is not enough memery");
		exit(-1);                    
		//位于标准库中
	}
	scanf("%d%d", &head0->serial_number, &head0->score);  
	//数据的读入                     
	head0->next = head1->next = NULL;
	p = head0;
	while (i < n - 1)                                   
	{
		q = (stu0)malloc(sizeof(stu1));
		q->next = NULL;
		scanf("%d%d", &q->serial_number, &q->score);
		p->next = q;
		p = q;
		i++;
	}
	scanf("%d%d", &head1->serial_number, &head1->score); 
	//在这里%d之间可以加空格
	p = head1;
	i = 0;
	while (i < m - 1)                                   
	{
		q = (stu0)malloc(sizeof(stu1));
		q->next = NULL;
		scanf("%d%d", &q->serial_number, &q->score);
		p->next = q;
		p = q;
		i++;
	}
	p = head0;                                   
	q = head1;
	while(p)                              
	//外层循环,对head0 进行遍历  
	{
		q = head1;
		j = 1;
		if (p == NULL)
		{
			break;
		}
		while(q)                              
		//内层循环,对q进行遍历 
		{
			if (p->serial_number == q->serial_number)    
			{
				j = 0;
				if (p == head0)
				{
					head0 = p->next;
					free(p);
					p = head0;
					break;
				}  
				else if (p->next == NULL)                
				{
					free(p);
					pq->next = NULL;
					p = NULL;
					break;
				}
				else                                    
				{
					pq->next = p->next;
					free(p);
					p = pq->next;                       
					break;
				}
			}
			else
			{
				q = q->next;
			}
		}
		if (j == 1)
		{
			pq = p;
			p = p->next;
		}
	}
	for (p = head0, i = 0; p; i++, p = p->next);  
	//用i来计数看看留下了多少个节点
	//也可以将i和j的使用合并,就可以少申请一个空间            
	printf("%d\n", i);
	for (p = head0; p; p = p->next)
	{
		printf("%d %d\n", p->serial_number, p->score); 
	//在这里,用for循环语句就可以和方便地输出所有的节点       
	} 
	
}


 

0.0分

1 人评分

  评论区