一个插入排序
时间:2010-04-18 来源:paulvon
今天师弟要我帮他写一个简单的程序,题目如下:已知一个数组,编写一个函数顺序读入数组中的每一个元素,将该数组转换为有序的单向链表,然后再写一个函数释放该链表所占用的内存。
分析可知,题目要求的就是一插入排序算法。于是马上开始用c写程序,调了半天,才稳定运行,万分的惭愧。好长时间没用c了,都感觉手生了,废话不多说了,贴出下面的源代码吧,供大家参考学习。
分析可知,题目就是一插入排序算法。
#include <stdio.h>
#include <stdlib.h>
struct Node
{
struct Node *next;
int value;
};
Node *insert(int a[],int n) { int *p,i,tmp; p=a; i=0; Node *t,*q,*s,*h;
t=(Node *)malloc(sizeof(Node)); t->value=*(p+i); t->next=NULL; i++; h=t; while(i<n) { s=h; t=(Node *)malloc(sizeof(Node)); t->value=*(p+i); t->next=NULL; q=s; s=s->next; //如果当前节点的下一个节点不空,且当前节点比要插入的节点值小,则往下走 while(s!=NULL && (q->value < t->value)) { q=s; s=s->next; } //如果当前节点的下一个节点空,且当前节点小于要插入的节点值, //则直接插在当前节点的后面 if(s==NULL && (q->value < t->value)) { q->next=t; } //如果当前节点的下一个节点空,且当前节点大于要插入的节点值, //则直接插在当前节点的前面 if(s==NULL && (q->value >= t->value)) { q->next=t; tmp=t->value; t->value=q->value; q->value=tmp;
} //如果当前节点的下一个节点不空,且当前节点大于要插入的节点值, //则先将要出入的节点插在当前节点的后面,然后再交换该节点和当前节点的值 if(s!=NULL&&(q->value >= t->value)) { q->next=t; t->next=s; tmp=t->value; t->value=q->value; q->value=tmp; } i++; } return h; } //打印显示链表的值 void diplay(Node *h) { Node *s; s=h; while(s!=NULL) { printf("%d ",s->value); s=s->next; } printf("\n Print over!\n"); } //释放链表的存储空间 void freemem(Node *h) { Node *s,*t; s=h; while(s!=NULL) { //想想这样会出现什么问题????? //free(s); //s=s->next; t=s->next; free(s); s=t; } printf("free over!\n"); }
int main() { int a[7]={6,10,1,5,4,9,7}; Node *head; head=insert(a,7); diplay(head); freemem(head); return 1; }
到此为止吧,很基础的东西。
Node *insert(int a[],int n) { int *p,i,tmp; p=a; i=0; Node *t,*q,*s,*h;
t=(Node *)malloc(sizeof(Node)); t->value=*(p+i); t->next=NULL; i++; h=t; while(i<n) { s=h; t=(Node *)malloc(sizeof(Node)); t->value=*(p+i); t->next=NULL; q=s; s=s->next; //如果当前节点的下一个节点不空,且当前节点比要插入的节点值小,则往下走 while(s!=NULL && (q->value < t->value)) { q=s; s=s->next; } //如果当前节点的下一个节点空,且当前节点小于要插入的节点值, //则直接插在当前节点的后面 if(s==NULL && (q->value < t->value)) { q->next=t; } //如果当前节点的下一个节点空,且当前节点大于要插入的节点值, //则直接插在当前节点的前面 if(s==NULL && (q->value >= t->value)) { q->next=t; tmp=t->value; t->value=q->value; q->value=tmp;
} //如果当前节点的下一个节点不空,且当前节点大于要插入的节点值, //则先将要出入的节点插在当前节点的后面,然后再交换该节点和当前节点的值 if(s!=NULL&&(q->value >= t->value)) { q->next=t; t->next=s; tmp=t->value; t->value=q->value; q->value=tmp; } i++; } return h; } //打印显示链表的值 void diplay(Node *h) { Node *s; s=h; while(s!=NULL) { printf("%d ",s->value); s=s->next; } printf("\n Print over!\n"); } //释放链表的存储空间 void freemem(Node *h) { Node *s,*t; s=h; while(s!=NULL) { //想想这样会出现什么问题????? //free(s); //s=s->next; t=s->next; free(s); s=t; } printf("free over!\n"); }
int main() { int a[7]={6,10,1,5,4,9,7}; Node *head; head=insert(a,7); diplay(head); freemem(head); return 1; }
到此为止吧,很基础的东西。
相关阅读 更多 +