C语言练习题-C语言练习题实例74
题目:连接两个链表。
程序分析:首先创建两个链表,然后遍历第一个链表找到最后一个节点,将其指针指向第二个链表的头节点,从而实现链表的连接。
实例
#include <stdlib.h>
#include <stdio.h>
struct list {
int data;
struct list *next;
};
typedef struct list node;
typedef node *link;
link delete_node(link pointer, link tmp) {
if (tmp == NULL) /*delete first node*/
return pointer->next;
else {
if (tmp->next->next == NULL)/*delete last node*/
tmp->next = NULL;
else /*delete the other node*/
tmp->next = tmp->next->next;
return pointer;
}
}
void selection_sort(link pointer, int num) {
link tmp, btmp;
int i, min;
for (i = 0; i < num; i++) {
tmp = pointer;
min = tmp->data;
btmp = NULL;
while (tmp->next) {
if (min > tmp->next->data) {
min = tmp->next->data;
btmp = tmp;
}
tmp = tmp->next;
}
printf("\40: %d\n", min);
pointer = delete_node(pointer, btmp);
}
}
link create_list(int array[], int num) {
link tmp1, tmp2, pointer;
int i;
pointer = (link)malloc(sizeof(node));
pointer->data = array[0];
tmp1 = pointer;
for (i = 1; i < num; i++) {
tmp2 = (link)malloc(sizeof(node));
tmp2->next = NULL;
tmp2->data = array[i];
tmp1->next = tmp2;
tmp1 = tmp1->next;
}
return pointer;
}
link concatenate(link pointer1, link pointer2) {
link tmp;
tmp = pointer1;
while (tmp->next)
tmp = tmp->next;
tmp->next = pointer2;
return pointer1;
}
int main(void) {
int arr1[] = {3, 12, 8, 9, 11};
int arr2[] = {5, 15, 6, 10, 7};
link ptr1, ptr2, result;
ptr1 = create_list(arr1, 5);
ptr2 = create_list(arr2, 5);
result = concatenate(ptr1, ptr2);
selection_sort(result, 10);
return 0;
}
在上述代码中,我们定义了一个结构体 list
,用于表示链表的节点,包括一个整型数据 data
和一个指向下一个节点的指针 next
。
然后,我们定义了一个 delete_node()
函数,用于删除链表中的节点。根据传入的节点指针 tmp
,判断需要删除的节点是链表的第一个节点、最后一个节点还是其他节点,然后进行相应的操作。
接下来,我们定义了一个 selection_sort()
函数,该函数用于对链表进行选择排序。遍历链表,找到当前节点后面最小的节点,将其值输出,并调用 delete_node()
函数删除该节点。
然后,我们定义了一个 create_list()
函数,用于创建链表。根据传入的数组 array
和节点个数 num
,创建相应个数的节点,并按照数组的顺序连接这些节点,最终返回链表的头节点。
接着,我们定义了一个 concatenate()
函数,该函数用于连接两个链表。遍历第一个链表,找到最后一个节点,将其指针指向第二个链表的头节点,从而实现链表的连接。
在 main()
函数中,我们首先创建两个链表 ptr1
和 ptr2
,分别使用 create_list()
函数创建。然后,调用 concatenate()
函数将两个链表连接起来,并将连接后的链表保存在 result
变量中。
最后,我们调用 selection_sort()
函数对连接后的链表进行选择排序,并输出排序结果。
最后,程序通过返回 0
来结束程序的执行。