单链表及快速排序c语言实现

复习回顾了下单链表,写个自己的版本。
/*
 ============================================================================
 Name        : 单链表(带表头L)
 Author      : 
 Version     :
 Copyright   : Your copyright notice
 Description : 单链表实现, Ansi-style
 ============================================================================
 */
#include 
   
   
    
    
#include 
    
    
     
     

#ifndef _List_H
#define _List_H
typedef int ElementType;

//构建节点
typedef struct Node
{
	ElementType Element;
	struct Node *Next;
} *List,*Position;

//1.链表初始化,若控制台输入遇到-1结束,或者自动生成一数列
List InitList()
{
	List L=(List)malloc(sizeof(struct Node));
	if(L==NULL)
	{
		printf("Out of Space!!!");
		exit(1);
	}
	L->Next=NULL;
	Position P=L;
	Position Tmp;

	printf(" Input char to select mode: i or n?\n");
	char mode;
	scanf("%c",&mode);
	if(mode=='i')
	{
		while(1)
		{
			ElementType indata;
			scanf("%d",&indata);
			if(indata==-1)
				break;
			Tmp=(Position)malloc(sizeof(struct Node));
			Tmp->Element=indata;
			Tmp->Next=NULL;
			P->Next=Tmp;
			P=P->Next;
		}
	}
	else
	{
		int i=0;
		while(i<10)
		{
			Tmp=(Position)malloc(sizeof(struct Node));
			Tmp->Element=10-i;
			Tmp->Next=NULL;
			P->Next=Tmp;
			P=P->Next;
			i++;
		}
	}
	return L;
}
//2.删除链表
void DeleteList(List L)
{
	Position P,Tmp;
	P=L->Next;
	L->Next=NULL;
	while(P!=NULL)
	{
		Tmp=P->Next;
		free(P);
		P=Tmp;
	}
}
//3.查找X
Position Find(ElementType X,List L)
{
	Position P;
	P=L->Next;
	while(P!=NULL&&P->Element!=X)
		P=P->Next;
	return P;
}
//4.查找X的前驱元素
Position FindPrevious(ElementType X,List L)
{
	Position P;
	P=L;
	while(P->Next!=NULL&&P->Next->Element!=X)
		P=P->Next;
	return P;
}
//5.删除X
void Delete(ElementType X,List L)
{
	Position P,TmpCell;
	P=FindPrevious(X,L);
	if(P->Next!=NULL)
	{
		TmpCell=P->Next;
		P->Next=TmpCell->Next;
		free(TmpCell);
	}
}
//6.在P位置后插入X
void Insert(ElementType X,List L,Position P)
{
	Position TmpCell=(Position)malloc(sizeof(struct Node));
	if(TmpCell==NULL)
	{
		printf("Out of Space!!!");
		exit(1);
	}
	TmpCell->Element=X;
	TmpCell->Next=P->Next;
	P->Next=TmpCell;
}

//7.返回链表长度
int SizeList(List L)
{
	int size=0;
	Position P=L->Next;
	while(P!=NULL)
	{
		P=P->Next;
		size++;
	}
	return size;
}
//8.打印链表
void PrintList(List L)
{
	if(L->Next==NULL)
		printf("链表为空\n");
	else
	{
		Position P=L->Next;
		while(P!=NULL)
		{
			char *cp=(char*)P;
			printf("0x%x: %d\n  ",cp,P->Element);
			P=P->Next;
		}
		printf("\n");
	}
}
//9.获得第N个节点的地址,第0个为表头L
Position GetAddr(List L,int N)
{
	Position P=L;
	int i;
	for(i=0;i
     
     
      
      Next;
	return P;
}
//10.链表快速排序
void QuickSort(Position Head,Position Tail)
{
	if(Head->Next!=Tail&&Head->Next->Next!=Tail)
	{
		static int count;
		printf("QuickSort调用第%d次数\n",count++);
		Position KeyP=Head->Next;      //指向存key值内存单元的指针
		Position LP=Head;              //比key值小的游标指针,KeyP的左边
		Position RP=KeyP;              //比key值大的游标指针,KeyP的右边
		Position IncP=KeyP->Next;      //遍历单链表的游标指针,每次移动一位
		while(IncP!=Tail)
		{
			if(IncP->Element
      
      
       
       Element)
				LP=LP->Next=IncP;
			else
				RP=RP->Next=IncP;
			IncP=IncP->Next;
		}
		LP->Next=KeyP;    //将小于Key值的子链表衔接
		RP->Next=Tail;    //将大于Key值的子链表衔接

		//递归
		QuickSort(Head,KeyP); //比Key小的子链表排序
		QuickSort(KeyP,Tail); //比Key大的子链表排序
		//注Head和Tail是不参与排序的,只起表头和表尾标识作用,故原链表的Tail值为NULL
	}
}
#endif/*_List_H*/

int main(void)
{
	//初始化链表
	List L=InitList();
	//打印
	printf("排序前\n");
	PrintList(L);
	printf("链表长度为%d\n",SizeList(L));
	//快速排序
	QuickSort(L,NULL);
	//打印
	printf("排序后\n");
	PrintList(L);

	//删除链表
	DeleteList(L);
	exit(0);
}

      
      
     
     
    
    
   
   
  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用C语言单链表进行快速排序实现示例: ```c #include<stdio.h> #include<stdlib.h> // 定义链表节点结构 struct ListNode { int val; struct ListNode *next; }; // 快速排序的辅助函数,用于交换两个链表节点的值 void swap(struct ListNode *a, struct ListNode *b) { int temp = a->val; a->val = b->val; b->val = temp; } // 快速排序的分割函数 struct ListNode* partition(struct ListNode *start, struct ListNode *end) { int pivot = start->val; struct ListNode *i = start; struct ListNode *j = start->next; while (j != end) { if (j->val < pivot) { i = i->next; swap(i, j); } j = j->next; } swap(start, i); return i; } // 快速排序的递归函数 void quickSort(struct ListNode *start, struct ListNode *end) { if (start != end && start->next != end) { struct ListNode *pivot = partition(start, end); quickSort(start, pivot); quickSort(pivot->next, end); } } // 对链表进行快速排序 struct ListNode* sortList(struct ListNode* head) { quickSort(head, NULL); return head; } // 创建一个新节点 struct ListNode* createNode(int val) { struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode)); newNode->val = val; newNode->next = NULL; return newNode; } // 在链表末尾插入一个节点 void insertNode(struct ListNode** head, int val) { struct ListNode* newNode = createNode(val); if (*head == NULL) { *head = newNode; return; } struct ListNode* temp = *head; while (temp->next != NULL) { temp = temp->next; } temp->next = newNode; } // 打印链表 void printList(struct ListNode* head) { struct ListNode* temp = head; while (temp != NULL) { printf("%d ", temp->val); temp = temp->next; } printf("\n"); } int main() { struct ListNode* head = NULL; // 插入一些测试数据 insertNode(&head, 3); insertNode(&head, 1); insertNode(&head, 7); insertNode(&head, 5); insertNode(&head, 2); printf("原始链表:"); printList(head); head = sortList(head); printf("排序后的链表:"); printList(head); return 0; } ``` 这段代码实现了对单链表进行快速排序的功能。首先定义了链表节点的结构,然后实现了交换两个节点值的辅助函数`swap`以及快速排序的分割函数`partition`。接下来,通过递归调用`quickSort`函数实现对链表的快速排序,最后实现了创建节点、插入节点、打印链表的辅助函数。在`main`函数中,插入了一些测试数据,然后调用`sortList`函数进行排序,并打印排序后的链表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值