简单链表(有头结点)
为了方便查看,在里面打印出了一些地址,数据
这里链表的排序类似插序法
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