用c语言完成下列程序的编写1.利用头插法或尾插法建立单链表。 2.对已建立的单链表实现插入、删除等基本操作。 3.输出链表所有节点数据。 4.编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表并计算表长。 5.要求利用原来两个单链表的结点存放归并后的单链表。
时间: 2024-10-07 17:02:41 浏览: 43
在C语言中,我们可以分别编写函数来完成上述单链表的操作:
1. **创建链表** (使用头插法)
```c
typedef struct Node {
int data;
struct Node* next;
} Node;
Node* createListByHeadInsertion(int data[], int size) {
Node* head = NULL;
for (int i = 0; i < size; i++) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data[i];
newNode->next = head;
head = newNode;
}
return head;
}
```
2. **插入和删除操作**
- 插入(例如在头部):
```c
void insertAtBegin(Node** head, int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = *head;
*head = newNode;
}
```
- 删除指定节点(需要指针指针来找到前一个节点):
```c
void deleteNode(Node** head, int target) {
if (*head == NULL || (*head)->data != target) return;
Node* temp = *head;
*head = (*head)->next;
free(temp);
}
```
3. **输出链表**
```c
void printList(Node* head) {
while (head != NULL) {
printf("%d ", head->data);
head = head->next;
}
printf("\n");
}
```
4. **合并两个有序链表** (假设第一个链表比第二个大)
```c
Node* mergeSortedLists(Node* list1, Node* list2) {
Node* mergedHead = list1 ? list1 : list2;
Node* tail = mergedHead;
// 遍历较小链表
while (list2 && list2->data < list1->data) {
tail->next = list2;
list2 = list2->next;
tail = tail->next;
}
// 合并较大链表
tail->next = list1;
return mergedHead;
}
int getLength(Node* head) {
int length = 0;
while (head) {
length++;
head = head->next;
}
return length;
}
```
5. **合并并计算长度**
```c
void mergeAndPrint(Node** head1, Node** head2) {
Node* mergedHead = mergeSortedLists(*head1, *head2);
int totalLength = getLength(mergedHead);
printList(mergedHead);
printf("Total length: %d\n", totalLength);
}
```
阅读全文