链表

简单链表(有头结点)
为了方便查看,在里面打印出了一些地址,数据

这里链表的排序类似插序法

void Sort(int *a,int nlen)
{
	int pos = 1;
	while(pos < nlen)
	{
		int i = 0;
		while(i < pos)
		{
			if(a[i] > a[pos])
			{
				a[i] = a[i]^a[pos];
				a[pos] = a[i]^a[pos];
				a[i] = a[i]^a[pos];
			}
			i++;
		}
		pos++;
	}
}

 

//链表排序代码如下
void Sort(LinkList l)
{
	LinkList start = l->next;
	//only one data
	if(start->next==NULL)
		return;
	LinkList pos = start->next;

	while(pos!=NULL)
	{
		LinkList i = start;
		while(i!=pos)
		{
			if(i->data > pos->data)
			{
				int temp;
				temp = i->data;
				i->data = pos->data;
				pos->data = temp;
			}
			i = i->next;
		}
		pos = pos->next;
	}	
}


示例代码如下

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


int g_n = 0;

typedef int ElemType;

typedef struct LNode
{
	ElemType data;
	struct LNode *next;
}LNode , *LinkList;


#define OK		1
#define ERROR	2
#define NULL    0

const int nLEN = sizeof(LNode);

void InitList(LinkList *l)
{
	//head point
	*l = (LinkList)malloc(nLEN);
	(*l)->next = NULL;
	(*l)->data = 0;
	printf("InitList : n = %d : %p\n",g_n++,*l);
}

void DestoryList(LinkList *l)
{
	LinkList p = *l;
	LinkList p1;
	p1 = p;
	while(p!=NULL)
	{
		p=p->next;
		printf("Destroy : n = %d : %p\n",g_n++,p1);
		free(p1);
		p1 = p;
	}
}

int ListLength(LinkList l)
{
	int nSize = 0;
	LinkList p = l->next;

	while(p)
	{
		p=p->next;
		nSize++;
	}

	return nSize;
}

//pos start at 0
int GetElem(LinkList l,int npos,ElemType *data)
{
	if(npos <0 ||npos >= ListLength(l) )
	{
		return ERROR;
	}

	int i = 0;
	LinkList p= l->next;
	while(p && i < npos)
	{
		p = p->next;
		i++;
	}
	*data = p->data;
	return OK;
}

int ListInsert(LinkList l,int npos , ElemType data)
{
	if(npos < 0 || npos > ListLength(l))
	{
		return ERROR;
	}

	LinkList p = l;
	int i = 0;

	LinkList s = (LinkList)malloc(nLEN);
	s->data = data;

	while(p->next!=NULL && i < npos)
	{
		p = p->next;
		i++;
	}
	s->next = p->next;
	p->next = s;

	printf("Insert : n = %d : data = %d : %p\n",g_n++,data , s);

	return OK;
}

int AppendList(LinkList l,ElemType data)
{
	LinkList s = (LinkList)malloc(nLEN);
	s->data = data;
	s->next = NULL;

	while(l->next!=NULL)
		l=l->next;
	
	printf("Append : n = %d : data = %d : %p\n",g_n++ , data , s);

	l->next = s;
	return OK;
}

int DeleteList(LinkList l,int npos)
{
	if(npos < 0 || npos >= ListLength(l))
	{
		return ERROR;
	}
	
	LinkList p = l;
	int i = 0;
	
	while(p->next!=NULL && i < npos)
	{
		p = p->next;
		i++;
	}
	//
	int data = p->next->data;

	LinkList s = p->next;
	p->next = p->next->next;

	printf("DeleteList : n = %d : data = %d : %p\n",g_n++ ,  data , s);

	free(s);
	
	
	return OK;
}

void VisitList(LinkList l)
{
	LinkList p = l->next;
	int n = 0;
	while( p!=NULL)
	{
		printf("%-3d : %-6d %p\n",n++,p->data,p);

		p=p->next;
	}
}

void Sort(LinkList l)
{
	LinkList start = l->next;
	//only one data
	if(start->next==NULL)
		return;
	LinkList pos = start->next;

	while(pos!=NULL)
	{
		LinkList i = start;
		while(i!=pos)
		{
			if(i->data > pos->data)
			{
				int temp;
				temp = i->data;
				i->data = pos->data;
				pos->data = temp;
			}
			i = i->next;
		}
		pos = pos->next;
	}	
}

void Sort(int *a,int nlen)
{
	int pos = 1;
	while(pos < nlen)
	{
		int i = 0;
		while(i < pos)
		{
			if(a[i] > a[pos])
			{
				a[i] = a[i]^a[pos];
				a[pos] = a[i]^a[pos];
				a[i] = a[i]^a[pos];
			}
			i++;
		}
		pos++;
	}
}

void _printf(int *p,int len)
{
	for(int i=0;i<len;i++)
	{
		printf("%-6d",p[i]);
	}
	printf("\n");
}
int main()
{
//
//	int a[]={7,8,9,4,5,6,1,2,3};
//	_printf(a,9);
//	Sort(a,9);
//	_printf(a,9);

//	return 0;

	LinkList l;
	InitList(&l);

	AppendList(l,10);
	AppendList(l,38);
	AppendList(l,50);
	AppendList(l,300);

	ListInsert(l,2,100);

	printf("\n");
	DeleteList(l,4);

	printf("\nVisitList:\n");
	VisitList(l);
	printf("\n");

	int n = ListLength(l);
	printf("nlength = %d\n",n);

	Sort(l);
	printf("Sort:\n");
	printf("VisitList:\n");
	VisitList(l);

	ElemType s=0;
	GetElem(l,3,&s);

	printf("GetElem : pos = 3 : data = %d\n",s);

	DestoryList(&l);
	return 0;
}

 

结果如下

InitList : n = 0 : 003828B0
Append : n = 1 : data = 10 : 003807A8
Append : n = 2 : data = 38 : 003807E0
Append : n = 3 : data = 50 : 00380818
Append : n = 4 : data = 300 : 00380850
Insert : n = 5 : data = 100 : 00380888

DeleteList : n = 6 : data = 300 : 00380850

VisitList:
0   : 10     003807A8
1   : 38     003807E0
2   : 100    00380888
3   : 50     00380818

nlength = 4
Sort:
VisitList:
0   : 10     003807A8
1   : 38     003807E0
2   : 50     00380888
3   : 100    00380818
GetElem : pos = 3 : data = 100
Destroy : n = 7 : 003828B0
Destroy : n = 8 : 003807A8
Destroy : n = 9 : 003807E0
Destroy : n = 10 : 00380888
Destroy : n = 11 : 00380818
Press any key to continue

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值