王道数据结构2022-线性表的链式表示-综合题(p41)-06有一个带头结点的单链表L,设计一个算法使其元素递增有序

有一个带头结点的单链表L,设计一个算法使其元素递增有序

#include
#include

typedef struct LNode { //定义单链表结点类型
	int data;//数据域
	struct LNode *next;//指针域
} LNode, *LinkList;

/*有一个带头结点的单链表L,设计一个算法使其元素递增有序*/

//带头结点尾插法建立单链表
LinkList List_TailInsert(LinkList &L) { //正向建立单链表
	int x;
	L=(LinkList)malloc(sizeof(LNode));
	L->data=999999;
	LNode *s, *r=L;//r为表为指针
	printf("请输入数值\n");
	scanf("%d",&x);
	while(x!=9999) { //输入 9999表示结束
		s=(LNode *)malloc(sizeof(LNode));
		s->data = x;
		r->next = s;
		r=s;//r指向新的表尾结点
		scanf("%d",&x);
	}
	r->next = NULL;//尾结点指针置空
	return L;
}

//打印链表
void print(LinkList L) {
	printf("\n");
	if(L->next==NULL)
		printf("该链表为空");
	LNode *p= L->next;
	while(p!=NULL) {
		printf("%d ",p->data);
		p=p->next;
	}
}

/*算法思想:
采用直接插入排序算法的思想,先构成只含一个数据结点的有序单链表
然后依次扫描单链表中剩下的结点*p(直至p==NULL为止),在有序表中
通过比较查找插入*p的前驱结点*pre,然后将*p插入到*pre之后*/
void sort(LinkList &L) {
	//本算法实现将单链表L的结点重排,使其递增有序
	LNode *pre,*p=L->next,*r=p->next;// r保持*p后继结点指针,以保证不断链
	p->next=NULL;
	p=r;
	while(p!=NULL) {
		r=p->next;
		pre = L;
		while(pre->next != NULL&&pre->next->data < p->data)
			pre=pre->next;//在有序表中查找插入*p的前驱结点*pre
		p->next = pre->next;//将p插到pre之后 
		pre->next = p;
		print(pre);
		p=r;//扫描原单链表中剩下的结点
	}
}

int main() {
	LinkList L=NULL;
	int x;
	List_TailInsert(L);
	print(L);
	sort(L);
	print(L);
	return 0;
}

运行结果

王道数据结构2022-线性表的链式表示-综合题(p41)-06有一个带头结点的单链表L,设计一个算法使其元素递增有序_第1张图片

你可能感兴趣的:(王道数据结构,数据结构,链表,算法)