使用C语言代码完成下面题目:有两个链表a和b,设结点中包含学号、姓名。从a链表中删去与b链表中有相同 学号的那些结点
时间: 2024-02-22 13:58:08 浏览: 114
以下是使用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
```
阅读全文