数据结构--排序、链表、树的代码

前言:我也忘了这些代码是哪里来的,也不知道为什么留在电脑里,索性直接贴出来好了

目录

链表

排序


链表

#include <stdio.h>
#include <assert.h>
#define MAXSIZE 10
#define SWAP(x, y, t) {t=x;x=y;y=t; }
typedef struct Sqlist{
	int data[MAXSIZE];
	int length;
}Sqlist;

typedef struct LNode{
	int data;
	struct LNode* next;
}LNode;

typedef struct DLNode{
	int data;
	struct DLNode *prior;
	struct DLNode *next;
}DLNode; 

void show(Sqlist L){
	for (int i = 0; i< L.length; i++)
		printf("%d ", L.data[i]);
}
void initList(Sqlist &L){   //初始化顺序表 
	L.length = 0;
}
int getElem(Sqlist L, int p, int &e){   //获取指定位置的元素 
	if (p>L.length || p<0) return 0;
	e = L.data[p];
	return 1;
}
int findElem(Sqlist L, int x){   //通过元素值找下标 
	for (int i=0; i<L.length; i++){
		if (L.data[i] == x)
			return i;
	}
	return -1;
}
int insert(Sqlist &L, int p, int x){   //插入一个元素 
	if (p>L.length || p<0 || L.length > MAXSIZE) return 0;
	int i;
	for (i=L.length; i>=p; i++)	//把p给移走 
		L.data[i] = L.data[i-1];
	L.data[p] = x;
	++(L.length);  //DNF: do not forget
	return 1;
}
int deleteElem(Sqlist L, int x, int &e){  //删除一个元素 
	int p = findElem(L, x);
	if (p == -1) return 0;
	e = L.data[p];
	for (int i = p; i<L.length-1; i++){
		L.data[i] = L.data[i+1];
	}
	--(L.length);
	return 1;
}
void reverse(Sqlist &L){    //逆置顺序表 
	int temp, i, j;
	for (i = 0, j = L.length-1 ; i < j; ++i, --j){
		temp = L.data[i];
		L.data[i] = L.data[j];
		L.data[j] = temp;
	}
} 
int deleteRange(Sqlist &L, int i, int j){  //删除下标为i-j的元素 
	assert(0 <= i && 0 <= j);
	int delta = j+1-i;
	for (int k = j+1; k < L.length-1; ++k){
		L.data[k-delta] = L.data[k];		//把包括i之后的替换成j之后的 
	}
	L.length -= delta;
	return 1;
}
// 2 6 4 7 8 9 5 1 3 6
int Partition(Sqlist &L, int left, int right ){   //非递归快排 
	int i = left, j = right, temp;
	int pivot = L.data[i];
	while (i < j){
		while (i < j && pivot <= L.data[j]) --j;	//不加=若数列出现重复数 陷入死循环 
		if (i < j)
			L.data[i] = L.data[j];
		while (i < j && pivot > L.data[i]) ++i;
		if (i < j)
			L.data[j] = L.data[i];	
	}
	L.data[j] = pivot;
	return j;
} 
void QuickSort(Sqlist &L, int left, int right ){
	if( left >= right ) return ;
	int index = Partition(L, left, right ) ;
	QuickSort(L, left, index-1 ) ;
	QuickSort(L, index+1, right ) ; 
}
int ReQuickSort(Sqlist &L, int left, int right){ 	//递归快排
	if (left < right){
		int temp;
		int i = left, j = right+1;
		int pivot = L.data[left];
		do{
			do ++i;
			while (pivot > L.data[i]);
			do --j;
			while (pivot < L.data[j]);
			if (i < j) SWAP(L.data[i], L.data[j], temp);
		} while (i < j);
		SWAP(L.data[left], L.data[j], temp);
		ReQuickSort(L, left, j-1);
		ReQuickSort(L, j+1, right);   //not i+1 is j+1
	}
}

// --------------------LinkList-------------------------------
void initLinkList(LNode *list){			//初始化链表 
	list->next = NULL;	
}
void createListR(LNode *&list, int S[], int n){			//尾插法 
	LNode *q,*p;
	list = (LNode*)malloc(sizeof(LNode));
	list->next = NULL;
	p = list;
	for (int i=0; i<n; i++){
		q = (LNode*)malloc(sizeof(LNode));
		q->data = S[i];
		p->next = q;
		p = p->next;
	} 
	p->next = NULL;
}
void createListF(LNode *&list, int S[], int n){			//头插法 
	LNode *r;
	list = (LNode*)malloc(sizeof(LNode));
	list->next = NULL;
	r = list;
	for (int i=0; i<n; ++i){
		r = (LNode*)malloc(sizeof(LNode));
		r->data = S[i];
		r->next = list->next;
		list->next = r;
	}
}
void mergeI(LNode *A, LNode *B, LNode *&C){			//合并成递增increase单链表 注意&C 
	LNode *a, *b, *c;
	a = A->next;b = B->next;
	C = A;
	C->next = NULL;
	free(B);
	c = C;
	while (a && b){
		if (a->data > b->data){
			c->next = b;
			c = c->next;
			b = b->next;
		}else{
			c->next = a;
			c = c->next;
			a = a->next;
		}
	}
	if (a) c->next = a;
	if (b) c->next = b;
} 
void mergeD(LNode *A, LNode *B, LNode *&C){			//合并成递减decline单链表 
	LNode *a, *b, *s;
	a = A->next; b = B->next;
	C = A;
	C->next = NULL;
	free(B);
	while (a && b){
		if (a->data < b->data){		//两种方式都可以头插进去	 
			s = a->next;    
			a->next = C->next;
			C->next = a;
			a = s;
		}else{					//第二种 
			s = b;
			b = b->next;
			s->next = C->next;
			C->next = s;
		}
	}
	while (a){  				//循环放入 
		s = a;
		a = a->next;
		s->next = C->next;
		C->next = s;
	}
	while (b){
		s = b;
		b = b->next;
		s->next = C->next;
		C->next = s;
	}
}
int findAndDelete(LNode *&list, int d){
	LNode *s;
	s = list;			//从头结点开始查 否则s->next会跳过第一个结点 
	while (s->next){   	//不能是s 因为 下面的if判断到最后一个结点是NULL会出错 
		if (s->next->data == d){
			LNode *del = s->next;
			s->next = del->next;
			free(del);
			return 1;
		}
		s = s->next;
		if (s->next == NULL) return 0;
	}	
} 
void deleteAtoB(LNode *&list, int a, int b){
	LNode *r = list, *del;
	while (r->next && r->next->data < b){
		if (r->next->data > a){
			del = r->next;
			r->next = del->next;
			free(del);
		}else r = r->next;
	}
} 
void deleteDuplicate(LNode *list){	//删除重复元素 
	LNode *front = list->next;   //链表有数据的结点 
	LNode *rear;		//链表front的下一个结点 
	while (front->next){
		rear = front->next;
		if (front->data == rear->data){ 
			front->next = rear->next;
			free(rear);
		}else{
			front = front->next;
		}
	}
} 
int count = 0;
void deleteMin(LNode *&list){
	LNode *pre, *p, *premin, *min;
	pre = list; p = pre->next;  //注意pre从list开始 从list->next开始会忽略第一个 
	premin = pre; min = p;
	while (p){
		if (p->data <= min->data){
			premin = pre;
			min = p;
		//	++count;
		}
		pre = p;
		p = p->next;
	}
	premin->next = min->next;  
	free(min);
}
LNode* reverseList(LNode *list){	//如果带头结点必须传入 list->next 
	LNode *p = list->next, *q;
	list->next = NULL;
	while (p){	//先保存下一个结点,然后头插交换顺序,在更新到下一个结点上 
		q = p->next;
		p->next = list->next;	//这步和下一步就是头插法 
		list->next = p;
		p = q;
	}
	return list;
	/*if (list){
		reverseList(list->next);
		printf("%d ", list->data);
	}*/
}
void showLinkList(LNode *list){
	LNode *s;
	s = list->next;
	while (s){
		printf("%d ", s->data);
		s = s->next;
	}
}

void BubbleSort(LNode *head){
	LNode *q,*p, *tail;
	int i = 0;
	tail = NULL;
	while (head->next->next != tail){
		p = head;
		q = head->next;
		while (q->next != tail){
			if (q->data > q->next->data){
				p->next = q->next;	
				q->next = q->next->next;
				p->next->next = q;	//上面三步就是交换了结点顺序 手画一下就清楚了 
				q = p->next;	//使其重新回到p后,为了后续前进操作保持一致
							   //如 1532 修改完后p在3上,但if结束后,两者都进一即p是3;q是5
							  //一开始我是想让p=p->next,直接让它是冒泡交换后的大值 但这样子会跳过好多结点 
			}
			p = p->next;
			q = q->next;
		} 
		tail = q;	//如果没有发生交换 则会退出循环 
	}
} 
// 0 1 2 7 4 5 9 7 6 3
int main(){
	printf("相信自己!加油!");
	printf("\n");
/*	Sqlist L;
	for (int i = 0;i < 10;i++)
		scanf("%d", &L.data[i]);
	L.length = 10;
	//show(L);printf("\n");
	printf("%d", Partition(L,0,9));
	QuickSort(L,0,9);
	show(L);*/
	int a[10] = {1, 2, 99, 5, 4, 7, 8};
	int b[10] = {1, 3, 4, 9, 10, 12, 13};
	LNode *A, *B, *C;
	createListR(A, a, 7);
//	createListR(B, b, 7);
//	mergeF(A, B, C);
//	printf("%d", findAndDelete(A, 1));
//	deleteDuplicate(A);
//	B = reverseList(A);
//	deleteAtoB(A, 1, 8);
	//showLinkList(A);
	showLinkList(A); 
	printf("\n"); 
	BubbleSort(A); 
	showLinkList(A); 
	return 1;
}

#include <iostream>
using namespace std;

typedef struct Node
{//定义二叉树结构
    char data;
    struct Node *lchild,*rchild;
}*BiTree,BiTNode;

void CreateBiTree(BiTree &T)
{//先序创建二叉树
    char ch;
    cin>>ch;
    if(ch=='#') T=NULL;
    else{
        T=new BiTNode;
        T->data=ch;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }
}
void InOrderTraverse(BiTree T)
{//中序遍历
    if(T)
    {
        InOrderTraverse(T->lchild);
        cout<<T->data;
        InOrderTraverse(T->rchild);
    }
}
void PreOrderTraverse(BiTree T)
{//先序遍历
    if(T)
    {
        cout<<T->data;
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
    }
}
void PostOrderTraverse(BiTree T)
{//后序遍历
    if(T)
    {
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        cout<<T->data;
    }
}
void Copy(BiTree T,BiTree &NewT)
{//二叉树的复制
    if(T==NULL){
        NewT=NULL;
        return;
    }else
    {
        NewT=new BiTNode;
        NewT->data=T->data;
        Copy(T->lchild,NewT->lchild);
        Copy(T->rchild,NewT->rchild);
    }
}
int Depth(BiTree T)
{//树的深度
    if(T==NULL)
        return 0;
    else
    {
        int m=Depth(T->lchild);
        int n=Depth(T->rchild);
        if(m>n) return (m+1);
        else return (n+1);
    }
}
int NodeCount(BiTree T)
{//统计二叉树中结点的个数
    if(T==NULL) return 0;
    else return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}
int LeafCount(BiTree T)
{//统计二叉树中叶子结点的个数
    if(!T) return 0;
    if(!T->lchild &&!T->rchild){//如果二叉树左子树和右子树皆为空,说明该二叉树根节点为叶子节点,加1.
        return 1;
    }else{
        return LeafCount(T->lchild)+LeafCount(T->rchild);
    }
}
int Node_1_Count(BiTree T)
{//统计二叉树的度为1的结点个数
    if(!T) return 0;
    if((!T->lchild)&&(T->rchild)||(T->lchild)&&(!T->rchild))
        return 1 + Node_1_Count(T->lchild) + Node_1_Count(T->rchild);
    else
        return Node_1_Count(T->lchild) + Node_1_Count(T->rchild);
}
void PrintAllPath(BiTree T, char path[], int pathlen)
{//二叉树中从每个叶子结点到根结点的路径
  int i;
  if(T != NULL) {
    path[pathlen] = T->data; //将当前结点放入路径中
    if(T->lchild == NULL && T->rchild == NULL) {//叶子结点
        for(i = pathlen; i >= 0; i--)
            cout << path[i] << " " ;
      cout << endl;
    }else{
      PrintAllPath(T->lchild, path, pathlen + 1);
      PrintAllPath(T->rchild, path, pathlen + 1);
    }
  }
}
void ExChangeTree(BiTree &T)
{//构造函数,使用递归算法进行左右结点转换
    BiTree temp;
    if(T!=NULL){//判断T是否为空,非空进行转换,否则不转换
        temp=T->lchild;
        T->lchild=T->rchild;//直接交换节点地址
        T->rchild=temp;
        ExChangeTree(T->lchild);
        ExChangeTree(T->rchild);
    }
}
void DblOrderTraverse(BiTree T)
{//二叉树的双序遍历
    if(T)
    {
        cout<<T->data;
        DblOrderTraverse(T->lchild);
        cout<<T->data;//访问两遍
        DblOrderTraverse(T->rchild);
    }
}
int main()
{
    BiTree T;
    //测试例子AB#CD##E##F#GH###
    cout<<"先序遍历输入(以#结束):";
    CreateBiTree(T);
    cout<<"中序遍历输出:";
    InOrderTraverse(T);
    cout<<endl<<"先序遍历输出:";
    PreOrderTraverse(T);
    cout<<endl<<"后序遍历输出:";
    PostOrderTraverse(T);
    cout<<endl<<"树的深度:"<<Depth(T);
    cout<<endl<<"结点的个数:"<<NodeCount(T);
    cout<<endl<<"叶结点的个数:"<<LeafCount(T);
    cout<<endl<<"度为1的结点个数:"<<Node_1_Count(T);
    cout<<endl<<"二叉树中从每个叶子结点到根结点的所有路径:"<<endl;
    char path[256];
    int pathlen=0;
    PrintAllPath(T,path,pathlen);//
    //交换二叉树每个结点的左孩子和右孩子
    BiTree tem=T;//直接复制一颗树,在不改变原树的前提下,对临时树进行交换。
    ExChangeTree(tem);
    cout<<"先序遍历输出交换后的结果:";
    PreOrderTraverse(tem);
    cout<<endl<<"双序遍历输出:";
    DblOrderTraverse(T);
    return 0;
}

排序

#include <stdio.h>
#define SWAP(x,y,t) {t=y;y=x;x=t;}
void InsertSort(int a[], int n){			//直接插入 
	int i, j;
	int temp;
	for (i = 1; i<n; ++i){
		if (a[i] < a[i-1]){
			temp = a[i];
			for (j=i; j>=1 && a[j-1] > temp; --j)
				a[j] = a[j-1];
			a[j] = temp;
		}
	}
}

void BinaryInsertSort(int a[], int n){
	int i, j, low, high, mid, temp;
	for (i=0; i<n; ++i){
		low = 0;
		high = i-1;
		temp = a[i];
		while (low <= high){
			mid = (low+high)/2;
			if (a[mid] > temp)
				high = mid - 1;
			else
				low = mid + 1;
		}
		for (j=i-1; j>=high+1; --j)   //将i之前的元素后移 
			a[j+1] = a[j];
		a[j+1] = temp;  //在 
	}
}

void ShellSort(int a[], int n){
	int i, j, d, temp; 
	for (d = n/2; d>0 ; d /= 2){
		for (i = d; i<n; ++i){
			if (a[i-d] > a[i] ){
				temp = a[i];
				for (j=i ; j>=d && temp<a[j-d]; j -= d)
					a[j] = a[j-d];
				a[j] = temp;	
			}
		}
	}	
} 

void BubbleSort(int a[], int n){
	int i, j, temp, flag;
	for (i = n-1; i>0; --i){
		flag = 0;
		for (j = 0; j<i; ++j){	//j<i是因为下标从0开始与实际位置差一 
			if (a[j] > a[j+1]){
				temp = a[j];
				a[j] = a[j+1];
				a[j+1] = temp;
				flag = 1;
			}
		}
		if (!flag) return; 
	}	
}

void SelectSort(int a[], int n){
	int temp, k,i,j;
	for (i=0; i<n; ++i){
		k = i;
		for (j=i+1; j<n; ++j)
			if (a[k] > a[j])
				k = j;
		temp = a[i];
		a[i] = a[k];
		a[k] = temp;
	}
}

void QuickSort(int a[], int left, int right){   //递归实现 
	int i, j, temp, pivot;
	if (left < right){
		i = left; j = right+1;
		pivot = a[left];
		do {
			do ++i;
			while (pivot > a[i]);
			do --j;
			while (pivot < a[j]);
			if (i<j)  SWAP(a[i], a[j], temp); 
		}while (i<j);
		SWAP(a[left], a[j], temp);
		QuickSort(a,  left, j-1);
		QuickSort(a, j+1, right);
	}	
} 

int main(){
	int a[5] = {8,1,6,3,4};
	ShellSort(a,5);
	for (int i=0; i<5; ++i)
		printf("%d ", a[i]);
}

猜你喜欢

转载自blog.csdn.net/Z_timer/article/details/113814578