在单链表中,每个结点含有5个正整型的数据元素(若最后一个结点的数据元素不满5个,以值0充),试编写一算法查找值为n(n>0)的数据元素所在的结点指针以及在该结点中的序号,若链表中不存在该数据元素则返回空指针。
时间: 2024-01-22 09:21:01 浏览: 89
试写出一个计算单链表中结点个数的算法,其中指针p指向该链表的第一个结点。
以下是一个基于C语言的单链表的算法,用于查找值为n的数据元素所在的结点指针以及在该结点中的序号。其中,链表中每个节点的数据类型为Node,包含5个正整型数据元素,用数组data表示。若最后一个节点的数据元素不足5个,则用0补齐。
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_LEN 5 // 每个结点最多包含5个正整型数据元素
typedef struct ListNode {
int data[MAX_LEN]; // 数据元素
struct ListNode *next; // 指向下一个结点的指针
} Node, *List;
List createList(); // 创建链表
Node *findNode(List list, int n, int *index); // 查找结点
int main() {
List list = createList(); // 创建链表
int n, index;
printf("请输入要查找的数据元素:");
scanf("%d", &n);
Node *node = findNode(list, n, &index);
if (node == NULL) {
printf("链表中不存在该数据元素!\n");
} else {
printf("该数据元素在链表中第%d个结点中的第%d个位置\n", node->data, index);
}
return 0;
}
List createList() {
int data, len = 0;
List head = (List)malloc(sizeof(Node)), p = head;
printf("请输入数据元素,以-1结束:\n");
while (1) {
scanf("%d", &data);
if (data == -1) {
break;
}
p->data[len++] = data;
if (len == MAX_LEN) { // 当前结点已满,创建新结点
p->next = (List)malloc(sizeof(Node));
p = p->next;
len = 0;
}
}
while (len < MAX_LEN) { // 若最后一个结点不满5个数据元素,则用0补齐
p->data[len++] = 0;
}
p->next = NULL;
return head;
}
Node *findNode(List list, int n, int *index) {
int i = 0;
while (list != NULL) {
for (int j = 0; j < MAX_LEN; j++) { // 遍历当前结点的所有数据元素
if (list->data[j] == n) {
*index = j + 1;
return list;
}
}
list = list->next;
i++;
}
return NULL;
}
```
在该算法中,首先通过createList()函数创建了一个单链表,并将其存储在指针变量list中。然后,用户输入要查找的数据元素n。接着,通过findNode()函数查找n所在的结点指针以及在该结点中的序号,并将结果存储在指针变量node和整型变量index中。如果链表中不存在该数据元素,则返回空指针NULL。最后,根据node和index的值输出结果。
阅读全文