王道p40 9.给定一个带表头结点的单链表,设 head 为头指针,结点结构data为整型元素,next 为指针,写出算法 : 按递增次序输出单链表中各结点的数据元素并释放结点所占的

 本题代码如下(有注释)

void delete_min(linklist* head)
{
	while ((*head)->next != NULL)//循环到只剩下头节点
	{
		lnode* pre = *head;//pre为元素最小结点的前驱结点指针
		lnode* p = (*head)->next;//p为工作指针
		lnode* q;//指向被删除的结点
		while (p->next != NULL)//找到最小的结点
		{
			if (p->next->data < pre->next->data)
				pre = p;//记住当前最小值的前驱
			p = p->next;
		}
		printf("%d ", pre->next->data);//输出最小值结点的数据
		q = pre->next;//p指向最小结点
		pre->next = q->next;//pre后继指向q的后继
		free(q);//释放q结点
	}
	free(*head);//释放头节点
}

完整测试代码

#include
#include
typedef struct lnode
{
	int data;
	struct lnode* next;
}lnode,*linklist;
int n = 5;
int a[5] = { 2,1,9,8,7 };
void buildlinklist(linklist* head)//建立单链表
{
	*head = (lnode*)malloc(sizeof(lnode));
	(*head)->next = NULL;
	int i = 0;
	lnode* s = *head, * r = *head;
	for (i = 0; i < n; i++)
	{
		s = (lnode*)malloc(sizeof(lnode));
		s->data = a[i];
		s->next = r->next;
		r->next = s;
		r = s;
	}
	r->next = NULL;
}
void delete_min(linklist* head)
{
	while ((*head)->next != NULL)//循环到只剩下头节点
	{
		lnode* pre = *head;//pre为元素最小结点的前驱结点指针
		lnode* p = (*head)->next;//p为工作指针
		lnode* q;//指向被删除的结点
		while (p->next != NULL)//找到最小的结点
		{
			if (p->next->data < pre->next->data)
				pre = p;//记住当前最小值的前驱
			p = p->next;
		}
		printf("%d ", pre->next->data);//输出最小值结点的数据
		q = pre->next;//p指向最小结点
		pre->next = q->next;//pre后继指向q的后继
		free(q);//释放q结点
	}
	free(*head);//释放头节点
}
int main()
{
	linklist head;
	buildlinklist(&head);
	delete_min(&head);
	return 0;
}

你可能感兴趣的:(王道课后习题单链表,算法,c语言,数据结构)