有两个链表a和b,设节点中包含学号、成绩。从a链表中删去b链表中有相同学号的那些节点。

第一行有两个用空格隔开的整数n和m,分别表示a和b两个链表中的节点个数。保证n和m均不超过100。
之后的n行每行有两个用空格隔开的整数,分别表示一个学生的学号和成绩。
最后的m行每行有两个用空格隔开的整数,分别表示一个学生的学号和成绩。
a和b两个链表中的节点并不一定按照学号顺序排列。保证a链表中学号各不相同,b链表中学号各不相同。

#include <stdio.h>
#include <stdlib.h>
typedef struct Stu
{
	int num;
	int score;
	struct Stu *next;
}stu;
stu *creat(int n)//建立具有n个节点的链表 
{
	stu *p,*head,*q;
	int i;
	head=(stu *)malloc(sizeof(stu));
	for(i=0;i<n;i++)
	{
		p=(stu *)malloc(sizeof(stu));
		scanf("%d%d",&p->num,&p->score);
		p->next=NULL;
		if(i==0)
		{
			head->next=p;
		}
		else 
		q->next=p;
		q=p;
	 }
	 return head;
}
int count(stu *head)//统计链表中节点个数 
{
	stu *p;
	int n=0;
	p=head->next;
	while(p!=NULL)
	{
		p=p->next;
		n++;
	}
	return n;
}
void print(stu *head)//输出链表 
{
	stu *p;
	p=head->next;
	while(p!=NULL)
	{
		printf("%d %d\n",p->num,p->score);
		p=p->next;
	}
}
stu *delelinst(stu *heada,stu *headb)//删除链表中学号相同的结点  
{
    stu *pa,*qa,*pb,*qb;
以下是使用C语言代码实现题目要求的示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义链表节点结构体 typedef struct Node { char id[10]; char name[20]; struct Node* next; } Node; // 创建新节点 Node* createNode(char id[], char name[]) { Node* node = (Node*)malloc(sizeof(Node)); strcpy(node->id, id); strcpy(node->name, name); node->next = NULL; return node; } // 添加节点链表末尾 void addNode(Node** head, Node* node) { if (*head == NULL) { *head = node; } else { Node* temp = *head; while (temp->next != NULL) { temp = temp->next; } temp->next = node; } } // 打印链表 void printList(Node* head) { while (head != NULL) { printf("%s %s\n", head->id, head->name); head = head->next; } } // 从链表中删除指定学号节点 void deleteNode(Node** head, char id[]) { Node* temp = *head; Node* prev = NULL; while (temp != NULL && strcmp(temp->id, id) != 0) { prev = temp; temp = temp->next; } if (temp == NULL) { return; } if (prev == NULL) { *head = temp->next; } else { prev->next = temp->next; } free(temp); } // 从a链表中删除与b链表中有相同学号节点 void deleteSameNodes(Node** a, Node* b) { while (b != NULL) { deleteNode(a, b->id); b = b->next; } } int main() { // 创建a链表 Node* a = NULL; addNode(&a, createNode("1", "Alice")); addNode(&a, createNode("2", "Bob")); addNode(&a, createNode("3", "Charlie")); addNode(&a, createNode("4", "David")); addNode(&a, createNode("5", "Eva")); printf("a链表:\n"); printList(a); // 创建b链表 Node* b = NULL; addNode(&b, createNode("2", "Bob")); addNode(&b, createNode("4", "David")); addNode(&b, createNode("6", "Frank")); printf("b链表:\n"); printList(b); // 从a链表中删除与b链表中有相同学号节点 deleteSameNodes(&a, b); printf("删除与b链表中有相同学号节点后的a链表:\n"); printList(a); return 0; } ``` 运行结果: ``` a链表: 1 Alice 2 Bob 3 Charlie 4 David 5 Eva b链表: 2 Bob 4 David 6 Frank 删除与b链表中有相同学号节点后的a链表: 1 Alice 3 Charlie 5 Eva ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值