数据结构C语言版判断给定的单链表 L 是否为有序(非递增或非递减),将对应的函数命 名为 ListOrder_L()。
时间: 2024-10-20 14:06:33 浏览: 32
在 C 语言中,判断一个单链表是否有序可以采用迭代或递归的方式来实现。这里我们可以设计一个 ListOrder_L 函数,它接受链表的头节点作为输入,通过遍历链表并比较相邻节点的值来确定其顺序。
以下是一个简单的迭代方法:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 判断链表是否有序
int ListOrder_L(Node* head) {
if (head == NULL || head->next == NULL) { // 空链表或只有一个元素,视为有序
return 1;
}
// 初始化标志变量
int isAscending = 1; // 假设列表按升序排列
int prevData = head->data;
Node* curr = head->next;
while (curr != NULL) {
if (prevData > curr->data) { // 如果当前元素小于前一个元素,说明不是升序
isAscending = 0;
break;
} else if (prevData < curr->data) { // 非降序也不是升序
break;
}
prevData = curr->data;
curr = curr->next;
}
return isAscending; // 返回结果,1 表示升序,0 表示非升序
}
// 示例链表操作
Node* createList(int arr[], int n) {
Node* head = malloc(sizeof(Node));
head->data = arr[0];
head->next = NULL;
for (int i = 1; i < n; ++i) {
Node* newNode = malloc(sizeof(Node));
newNode->data = arr[i];
newNode->next = head->next;
head->next = newNode;
}
return head;
}
int main() {
int arr[] = {1, 2, 4, 5, 6};
Node* list = createList(arr, sizeof(arr)/sizeof(arr[0]));
int order = ListOrder_L(list);
if (order) {
printf("链表是有序的 (升序)\n");
} else {
printf("链表是无序的\n");
}
return 0;
}
```
在这个例子中,`ListOrder_L()` 函数会检查链表是否按照升序排列。如果想检查降序,只需修改 `if (prevData > curr->data)` 的条件即可。
阅读全文