链表选择排序算法功能实现演示

算法:
狭义的算法是与数据的存数方式密切相关
广义的算法是与数据的存储方式无关
泛型:
利用某种技术达到的效果就是:不同的存数方式,执行的操作是一样的 

#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>


typedef struct Node {
	int data;  //数据域
	struct Node * pNext;   //指针域

}Node, *pNode;

//函数声明
pNode create_list();
void traverse_list(pNode  pHead);

bool is_empty(pNode pHead);          //判断链表是否为空
int length_list(pNode pHead);        //链表的长度
bool insert_list(pNode, int, int);   //插入  第一个参数表示插入的链表  第二个参数表示插入的位置  第三个参数表示插入的元素
bool delete_list(pNode, int, int *); //第一个参数表示要删除的位置,第二个参数表示要删除的位置 第三参数表示删除的元素的地址放入指针
void sort_list(pNode pHead);

int main(void) {

	pNode  pHead = NULL;   //等价于 struct Node *pHead=NULL
	pHead = create_list();    //create_list()创建一个非循环单链表,并将该链表的头结点的地址赋给pHead
	traverse_list(pHead);

	int len = length_list(pHead);
	printf("链表的长度%d\n", len);

    sort_list(pHead);      //选择排序
	traverse_list(pHead);  //遍历输出

	 while(true){}

	return 0;
}

//创建单链表
pNode create_list() {

	int len;   //用来存放有效节点数
	int i;
	int val; //存放用户临时输入的节点数据

	//我们首先要先生成一个头结点  不存放有效数据
	pNode pHead = (pNode)malloc(sizeof(Node));
	if (NULL == pHead) {
		printf("内存分配失败");
		//程序退出
		exit(-1);
	}
	
    
	pNode pTail = pHead;    //pTail也指向了头结点
	pTail->pNext = NULL;

	printf("请输入你要输入节点的个数 len =");
	scanf_s("%d", &len);

	//假设输入的长度5,我们需要循环
	for ( i = 0; i < len; i++){
		printf("请输入第%d个节点的值:", i + 1);
		scanf_s("%d", &val);

		pNode pNew=(pNode)malloc(sizeof(Node));
		if (NULL == pNew) {
			printf("内存分配失败");
			//程序退出
			exit(-1);
		}


		pNew->data = val;
		//pHead->pNext = pNew;
		//pNew->pNext = NULL;
		pTail->pNext = pNew;  //将这个新节点挂到尾节点
		pNew->pNext = NULL;
		pTail = pNew;

	}

	return pHead;
}

//遍历
void traverse_list(pNode  pHead) {

	pNode p = pHead->pNext;
	while (p!=NULL){
		printf("%d ",p->data);
		p = p->pNext;
	}
	//换行
	printf("\n");

	return;
}

//判断链表是否为空
bool is_empty(pNode pHead) {

	if (NULL == pHead->pNext) {
		return true;
	}else {
		return false;
	}
}

//求一个链表的长度
int length_list(pNode pHead) {
	pNode p=pHead->pNext;   //第一个节点
	int len = 0;
	while (NULL != p) {   //只要指针指向的下一个元素不是空,指针就继续向后移动
		++len;
		p=p->pNext;
	}
	return len;
}


//排序算法
void sort_arr(pNode pHead) {

	int i, j, tmp;
	int arr[6] = { 5,8,45,2,9,3 };
	int len=length_list(pHead);  //获取链表长度
	pNode p, q;
	for (i = 0; i < len-1; i++){

		for (j = i+1; j < len; j++){
			
		}

	}

}



//选择排序  从小到大排
void sort_list(pNode pHead){
	int i,j,t;
	int len = length_list(pHead);  //获取链表长度
	pNode p,q;
	for (i = 0, p = pHead->pNext; i < len - 1; ++i, p = p->pNext){
		for (j = i + 1, q = p -> pNext; j < len; ++j, q = q->pNext) {
			if (p->data > q->data) {        //类似于 数组中的: a[i] > a[j]
				t = p->data;                //类似于数组中的: t = a[i];
				p->data = q->data;          //类似于数组中的: a[i] = a[j];
				q->data = t;                // 类似于数组中的: a[j] = t;
			}
		}
	}
}

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值