基于链表的排序与查找

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于链表的排序与查找

摘要:链表是程序设计中的一种重要的动态数据结构,它是动态地进行存储分配的一种结构。链表即采用链式存储结构的线性表。对线性表,我们主要对其的操作有:建立,插入,删除,查找,排序等。此次实践主要是针对于链表的排序和查找进行。

关键字:链表排序查找

1引言

排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列,以便于进行数据的查询。而基于链表的查找是采用的动态查找表,是求出一个数据元素在序列中的索引或指针,将其返回。

2需求分析

(1)建立链表;

(2)基于链表的排序算法实现;

(3)基于链表的查找算法实现。

3数据结构

3.1建立链表

3.1.1节点定义

typedef struct node//定义节点

{

int data;

struct node *next;

}lnode, *linklist;

3.1.2链表尾部插入

void insertlist(linklist l,int i)//链表尾部插入

{

linklist p,s;

s=(linklist)malloc(sizeof(lnode));

s->data=i;

s->next=NULL;

p->next=s;

}

此时,相应的主函数中应该有存储代码,才能完成数据的链式存储。

int i,n,f,a[100];

h=(lnode)malloc(sizeof(lnode));

lnode *r,*p,*s;

h->data=0;

h->next =NULL;

r=h;

printf("请输入数据的数目:");

scanf("%d",&n);

for(i=0;i

{

printf("%d:",i+1);

scanf("%d",&a[i]);

insert(h,a[i]);

h=h->next ;

}

h=r;

h为头指针,将h赋给r,r记录h初始指向地址,在存完数据后,再将r赋给h。4算法设计

4.1排序算法的设计

4.1.1排序的定义

假设含n个记录的序列为

{R

1,R

2

,···,R

n

} (a)

其相应的关键字序列为

{K

1,K

2

,···,K

n

} (b)

需确定1,2,···,n的一种排列p

1,p

2

,···,p

n

,使其相应的关键字满足如下的非递减

(或非递增)关系

K

p1≤ K

p2

≤···≤K

pn

K p1≥ K

p2

≥··≥K

pn

(c)

即使式(b)的序列成为一个按关键字有序的序列

{R

p1,R

p2

,···,R

pn

}

其中关系符“≥”“≤”并不一定是数学意义上的“小于或等于”或“大于或等于”,而是一种次序关系。为了讨论方便,一般取整形数作为记录的key,故“≤”

或“≥”可作为通常意义上的符号看待。

4.1.2排序的算法

数据结构课程上,我们学习了直接插入排序、冒泡排序、快速排序、希尔排序、归并排序、堆排序、基数排序、选择排序。此时我采用选择排序:

void linksort(linklist l)//采用链表的选择排序

{

lnode *p,*q,*m,*n;

lnode *temp1,*temp2;

if(l->next==NULL)

printf("没找到链表!!");

else

{

p=l;q=l->next;

while(q->next!=NULL)

{

m=p->next;

n=q->next;

temp1=m;

while(temp1->next!=NULL)

{

if(temp1->next->datadata&&temp1->next->datadata) {

m=temp1;n=temp1->next;

}

temp1=temp1->next;

}

if(m!=p->next || (m==p->next && m->data>n->data))

{

p->next=n;

p=n;

m->next=q;

m=q;

q=q->next;

n=n->next;

p->next=q;

m->next=n;

}

else

{

p=p->next;

q=q->next;

}

}

temp2=l->next;

}

}

4.2查找算法的设计

lnode *find(lnode *p,int e)

{

lnode *r;

r=p;

while(r!=NULL && r->data!=e)

{r=r->next ;}

return r;

}

4.3程序主函数的设计

int main()//主函数

{

int i,n,f,a[100];

lnode *h;

h=(linklist)malloc(sizeof(lnode));

lnode *r,*s;

h->data=0;

h->next=NULL;

r=h;

printf("请输入数据的数目:");

scanf("%d",&n);

for(i=0;i

{

printf("%d:",i+1);

scanf("%d",&a[i]);

insertlist(h,a[i]);

}

h=r;

printf("请输入要查找的元素:");

scanf("%d",&f);

相关文档
最新文档