帮我写一个C语言代码,能够以8位学号为基础按照数字顺序设计个位数和两位数基础数据。 例如学号21106101,生成无重复的个位数数据为:2,1,0,6,每两位生成数据为:21,10, 61,1;去掉重复数据为:2,1,0,6,21,10,61。这7个数字作为后面实验使用的数据。采用前插法创建带头节点的单链表,顺序输入设计的多个整数数据,创建单链表,能够进行查找、删除和列出元素功能。函数名称:CreateSL
时间: 2024-02-25 20:51:35 浏览: 74
下面是符合您要求的代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int data;
struct Node *next;
} Node;
// 创建带头节点的单链表
Node *CreateSL(int data[], int n) {
Node *head = (Node *)malloc(sizeof(Node));
head->next = NULL;
Node *p;
for (int i = n - 1; i >= 0; i--) {
p = (Node *)malloc(sizeof(Node));
p->data = data[i];
p->next = head->next;
head->next = p;
}
return head;
}
// 查找元素
Node *Find(Node *head, int x) {
Node *p = head->next;
while (p != NULL) {
if (p->data == x) {
return p;
}
p = p->next;
}
return NULL;
}
// 删除元素
void Delete(Node *head, int x) {
Node *p = head;
while (p->next != NULL) {
if (p->next->data == x) {
Node *temp = p->next;
p->next = temp->next;
free(temp);
return;
}
p = p->next;
}
}
// 列出元素
void List(Node *head) {
Node *p = head->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
int data[] = {2, 1, 0, 6, 21, 10, 61};
int n = 7;
Node *head = CreateSL(data, n);
List(head);
Delete(head, 2);
List(head);
Node *p = Find(head, 10);
if (p != NULL) {
printf("%d\n", p->data);
}
return 0;
}
```
在这个代码中,我定义了一个 `Node` 结构体来表示链表节点,其中包含了节点的值 `data` 和指向下一个节点的指针 `next`。然后,我定义了 `CreateSL` 函数来创建带头节点的单链表,该函数接收一个整型数组和数组长度作为参数,返回链表头节点的指针。在函数中,我采用前插法创建链表,从数组的最后一个元素开始遍历,创建新的节点,并将其插入到链表头节点之后。最后,返回链表头节点的指针。
除了创建链表之外,我还定义了 `Find` 函数来查找链表中是否存在某个元素,该函数接收链表头节点的指针和要查找的元素作为参数,返回指向该元素的节点的指针。如果链表中不存在该元素,则返回 `NULL`。我还定义了 `Delete` 函数来删除链表中的某个元素,该函数接收链表头节点的指针和要删除的元素作为参数,没有返回值。在函数中,我遍历链表,找到需要删除的节点,并释放其内存。最后,我还定义了 `List` 函数来列出链表中的所有元素,该函数接收链表头节点的指针作为参数,没有返回值。在函数中,我遍历链表,输出每个节点的值。
最后,在 `main` 函数中,我定义了一个整型数组 `data` 来存储题目中给出的数据,然后调用 `CreateSL` 函数来创建带头节点的单链表,并分别调用 `List`、`Delete` 和 `Find` 函数来列出元素、删除元素和查找元素。
阅读全文