#include
#include
struct list //定义一个结构,struct为关键字,list为结构名
{ int data; //结构包含一个整型数据data
struct list *next; //结构包含一个指针next
};
typedef struct list node; //typedef为关键字,声明一个和list型结构相同的结构node(结点)
typedef node *link; //声明一个node型指针link
link delete_node(link pointer,link tmp) //删除结点
{if (tmp==NULL) /*delete first node*/
return pointer->next;//如果链表pointer的头结点为空(NULL),返回pointer的next指针
else
{ if(tmp->next->next==NULL)/*delete last node*/ //判断tmp的后面只有一个结点的情况
tmp->next=NULL; //将tmp的下一个结点赋值为空(NULL),即删除tmp后面的那个结点
else /*delete the other node*/
tmp->next=tmp->next->next; //让tmp的指针next指向下下一个结点,将tmp后面紧接着的那个结点删除
return pointer; //将新的链表pointer返回
}
}
void selection_sort(link pointer,int num)//选择排序
{ link tmp,btmp;
int i,min;
for(i=0;i
tmp=pointer; //将poiner赋值给tmp
min=tmp->data; //将tmp头结点的数据赋值给min
btmp=NULL; //将btmp赋值为空(NULL)
while(tmp->next) //当tmp->next不为空(NULL),执行while语句
{ if(min>tmp->next->data) //如果min的值比tmp->next的数值大
{min=tmp->next->data; //将tmp->next的值赋值给min
btmp=tmp;//将头结点赋值给btmp
}
tmp=tmp->next;//将tmp->next(即头结点的下一个结点)赋值给tmp,以便下次遍历从tmp开始,
}
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));//调用malloc关键字申请一段内存空间,长度为node型结构的大小,用(link)强制转换为link型,然后将该存储空间给pointer.
pointer->data=array[0];//将数组array[]的第0个值赋值给pointer的头结点数据.
tmp1=pointer;//将pointer赋值给tmp1.
for(i=1;i
tmp2->next=NULL; //tmp2的next指针赋值为空(NULL)
tmp2->data=array[i]; //tmp2的数据赋值为数组array[]的第i个元素的值
tmp1->next=tmp2;//将tmp1的next指针指向tmp2
tmp1=tmp1->next; //将tmp1指针下移一个
}
return pointer; //返回pointer
}
link concatenate(link pointer1,link pointer2)
{ link tmp;
tmp=pointer1; //pointer1的表头赋值给tmp
while(tmp->next) //tmp->next为真,即tmp的下一个不为空(NULL),执行循环语句
tmp=tmp->next;//tmp头指针指向下一个
tmp->next=pointer2; //pointer2的表头赋值给tmp的后面一个
return pointer1; //返回pointer1
}
void main(void)
{ int arr1[]={3,12,8,9,11};//定义一个整型数组并赋值
link ptr;
ptr=create_list(arr1,5); //函数调用
selection_sort(ptr,5);
}