Chinaunix首页 | 论坛 | 博客
  • 博客访问: 102055
  • 博文数量: 27
  • 博客积分: 1132
  • 博客等级: 少尉
  • 技术积分: 278
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-22 13:56
文章分类

全部博文(27)

文章存档

2011年(1)

2010年(18)

2009年(8)

分类: C/C++

2010-04-18 20:26:07

   今天师弟要我帮他写一个简单的程序,题目如下:已知一个数组,编写一个函数顺序读入数组中的每一个元素,将该数组转换为有序的单向链表,然后再写一个函数释放该链表所占用的内存。 
   分析可知,题目要求的就是一插入排序算法。于是马上开始用c写程序,调了半天,才稳定运行,万分的惭愧。好长时间没用c了,都感觉手生了,废话不多说了,贴出下面的源代码吧,供大家参考学习。
分析可知,题目就是一插入排序算法。
#include
#include
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
{
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;
}

到此为止吧,很基础的东西。
阅读(1154) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~