用c语言写一个函数,在单向链表中搜索元素x的算法。 如果x在表里,则输出它在表中的序号,否则,将 ×插在表尾。
时间: 2024-09-12 15:16:33 浏览: 41
C语言实现输出链表中倒数第k个节点
5星 · 资源好评率100%
在C语言中,编写这样一个函数需要我们定义链表的结构以及相关的操作函数。下面是一个简单的实现:
首先,定义链表的节点结构和初始化链表的函数:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int data; // 数据域
struct Node *next; // 指针域
} Node;
// 初始化链表,创建头节点
Node* createList() {
Node *head = (Node*)malloc(sizeof(Node));
if (head == NULL) {
exit(-1); // 分配失败,退出程序
}
head->next = NULL; // 头节点的next指针设置为NULL
return head;
}
```
然后,定义搜索和插入节点的函数:
```c
// 在链表中搜索元素x,如果找到则返回序号,否则返回-1
int searchAndInsert(Node *head, int x) {
Node *current = head->next; // 从头节点的下一个节点开始遍历
int index = 1; // 序号从1开始计数
while (current != NULL) {
if (current->data == x) {
printf("元素%d在表中的序号为: %d\n", x, index);
return index;
}
current = current->next;
index++;
}
// 如果没有找到,创建新节点并插入到链表尾部
Node *newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
exit(-1); // 分配失败,退出程序
}
newNode->data = x;
newNode->next = NULL; // 新节点的next指针设置为NULL
Node *temp = head;
while (temp->next != NULL) { // 找到链表尾部
temp = temp->next;
}
temp->next = newNode; // 插入新节点
printf("元素%d已被添加到表尾\n", x);
return -1; // 插入操作返回-1,表示没有找到
}
```
最后,编写测试代码:
```c
int main() {
Node *myList = createList(); // 创建链表
// 假设链表中已经有了若干元素,这里手动添加几个以便测试
myList->next = (Node*)malloc(sizeof(Node));
myList->next->data = 1;
myList->next->next = (Node*)malloc(sizeof(Node));
myList->next->next->data = 2;
myList->next->next->next = (Node*)malloc(sizeof(Node));
myList->next->next->next->data = 3;
int x = 2;
searchAndInsert(myList, x); // 搜索元素x
x = 4;
searchAndInsert(myList, x); // 将x插入链表尾部
// 清理链表内存
Node *current = myList;
Node *temp;
while (current != NULL) {
temp = current;
current = current->next;
free(temp);
}
return 0;
}
```
这个程序首先创建了一个链表,并手动添加了三个元素以便测试。然后调用`searchAndInsert`函数来搜索元素`2`和插入元素`4`。如果元素存在,会打印出元素在链表中的序号;如果不存在,会将元素添加到链表尾部,并打印提示信息。
阅读全文