#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;}void main(void){ int arr1[]={3,12,8,9,11}; link ptr; ptr=create_list(arr1,5); selection_sort(ptr,5);}
根据给定的文件信息,我们可以总结出以下关键知识点:
### 1. 链表的基本概念
链表是一种常见的线性数据结构,它通过指针将一组无序的节点连接在一起。每个节点包含两部分:一部分存储数据元素,另一部分保存指向下一个节点的指针。
### 2. C语言中的链表实现
#### 结构体定义
```c
struct list {
int data; // 存储数据
struct list *next; // 指向下一个节点的指针
};
```
这里定义了一个名为`list`的结构体类型,用于表示链表中的节点。其中`data`成员用来存放数据,`next`成员则是一个指向同一结构类型的指针,用于链接下一个节点。
#### 类型定义
```c
typedef struct list node;
typedef node *link;
```
这里使用了`typedef`关键字来简化结构体的使用。`node`为`struct list`的别名,而`link`则是`node`类型的指针别名,这使得在后续的函数声明和调用中可以更加简洁地使用这些类型。
### 3. 链表的基本操作
#### 创建链表
```c
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;
}
```
此函数接收一个整型数组`array`和数组的长度`num`作为参数,用于创建一个单向链表。首先为第一个节点分配内存,并将其数据设置为数组的第一个元素。然后遍历数组,为每个元素创建一个新的节点,并将其添加到链表的末尾。
#### 删除节点
```c
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;
}
}
```
该函数用于删除链表中的节点。根据传入的`tmp`指针指向的节点位置不同(首节点、尾节点或其他位置),采取不同的处理方式。如果删除的是首节点,则返回新的首节点;如果是尾节点,则将前一个节点的`next`设为`NULL`;对于其他位置的节点,只需调整前一个节点的`next`指针即可。
#### 连接两个链表
```c
link concatenate(link pointer1, link pointer2)
{
link tmp;
tmp = pointer1;
while (tmp->next)
tmp = tmp->next;
tmp->next = pointer2;
return pointer1;
}
```
此函数用于将两个链表连接起来。首先找到`pointer1`所指向的链表的最后一个节点,然后将其`next`指针设置为`pointer2`所指向的链表的首节点,从而完成两个链表的合并。
#### 选择排序
```c
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);
}
}
```
该函数实现了选择排序算法,对链表进行排序。首先遍历整个链表找到最小值,然后将其从链表中删除,并输出该值。重复这一过程直到所有元素都被处理完毕。
### 4. 主函数
```c
void main(void)
{
int arr1[] = {3, 12, 8, 9, 11};
link ptr;
ptr = create_list(arr1, 5);
selection_sort(ptr, 5);
}
```
主函数中定义了一个整型数组`arr1`,并通过调用`create_list`函数创建了一个链表。接着调用`selection_sort`函数对链表进行排序。
本篇代码主要介绍了如何使用C语言实现链表的基本操作,包括链表的创建、删除节点、连接两个链表以及链表的选择排序。这对于理解和掌握链表这一重要的数据结构具有重要意义。