输入无序的元素,分别建立两个有3个结点的逆序单链表(有头结点)(显示排序后的链表),合并两个单链表使之仍然有序,显示合并后的单链表。c语言
时间: 2024-12-02 19:15:26 浏览: 1
JAVA单链表的简单操作(递增单链表插入数据,链表逆置,链表逆序合成)
在C语言中,你可以通过以下几个步骤来实现这个功能:
1. **创建逆序单链表**:
首先,你需要创建一个逆序链表结构,每个节点包含一个整数数据和指向下一个节点的指针。对于输入无序的3个元素,可以先将它们按照逆序排列。
```c
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建逆序链表函数
Node* createReversedList(int arr[], int n) {
Node* head = NULL;
for (int i = n - 1; i >= 0; i--) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = arr[i];
newNode->next = head;
head = newNode;
}
return head;
}
```
2. **合并两个逆序链表**:
使用两个指针`p1`和`p2`分别指向这两个逆序链表的头节点,并初始化结果链表`head`为NULL。比较当前节点的数据,将较小的那个添加到结果链表并移动相应的指针。
```c
Node* mergeLists(Node* p1, Node* p2, Node** head) {
Node* headRef = *head;
if (p1 == NULL) {
*head = p2;
} else if (p2 == NULL) {
*head = p1;
} else if (p1->data <= p2->data) {
(*head)->next = p1;
p1 = p1->next;
} else {
(*head)->next = p2;
p2 = p2->next;
}
*head = headRef; // 更新head,以便下一次比较
return p1 ? p1 : p2; // 返回未遍历完的链表的头节点
}
```
3. **合并后显示链表**:
最后,遍历合并后的链表并打印每个节点的数据。
```c
void printList(Node* node) {
while (node != NULL) {
printf("%d -> ", node->data);
node = node->next;
}
printf("NULL\n");
}
// 主函数
int main() {
int arr1[] = {5, 3, 7};
int arr2[] = {9, 1, 6};
Node* list1 = createReversedList(arr1, 3);
Node* list2 = createReversedList(arr2, 3);
Node* mergedList = mergeLists(list1, list2, &list1); // 或者 &list2,取决于初始值
printList(mergedList);
return 0;
}
```
运行上述代码,你会看到排序后的合并后的链表。
阅读全文