基于链表的排序与查找
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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<n;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->data<q->data&&temp1->next->data<n->data) {
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<n;i++)
{
printf("%d:",i+1);
scanf("%d",&a[i]);
insertlist(h,a[i]);
}
h=r;
printf("请输入要查找的元素:");
scanf("%d",&f);
printf("此时并没有对该序列进行排序,顺序为:"); for(i=0;i<n;i++)
{
printf("%5d",h->data);
h=h->next;
}
printf("\n");
h=r;
s=find(h,f);
printf("您所查找的元素的下一项为:");
if(s->next!=NULL)
printf("%d\n",s->next->data);
else
printf("所查元素在队尾!!");
linksort(h);
printf("此时您已进行排序\n");
printf("排序后的顺序为:");
while(h!=NULL)
{
h=h->next;
printf("%5d",h->data);
}
printf("\n");
h=r;
s=find(h,f);
printf("您所查找的元素的下一项为:");
if(s->next !=NULL)
printf("%d\n",s->next->data);
else
printf("所查元素在队尾!!");
return 0;
}
5运行结果
6结果分析
此次课程实践完成了用c语言实现链表的排序与查找。
在设计排序算法时,我选择了选择排序的方式。
根据链表的性质,选择排序应该具有更高效的运算能力,为了保证算法的高效性,我选择了它。
查找算法我分别在排序前和排序后都使用了,保证了查找的准确性。
7设计体会
经过一个学期的数据结构的学习,我们学到了很多不同的方法,大一的时候学习C语言,我们就只知道了冒泡排序和快速排序,而学习了数据结构之后我们更能够掌握其他不同的排序方法。
达到的目的相同,但运行的过程不同,花的时间不同,因此也需要我们分析它的时间复杂度,空间复杂度等,使得我们的算法千变万化。
这次数据结构课程设计,我切身的体会到程序必须满足整体严谨,思路清晰,方法合理三个方面,对于综合性的程
序更是如此,编程是一个很烦琐的过程,每一小步都要以整体为出发点稍有不慎即导致整个程序出错。
8参考文献
[1]张瑞,吕涛主编《C程序设计教程》华中科技大学出版社 2012年
[2]严蔚敏,吴伟民主编《数据结构(C语言版)》清华大学出版社 2007年
[2]徐绪松主编《数据结构与算法导论》电子工业出版社 2005年。