基于链表的排序与查找
- 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 { 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 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);