您的位置:首页 > 其它

08年以前华中科大的一道机试题

2011-09-10 19:01 411 查看
/*08年以前的题目(1) 输入一个数列以0位结束标志,建立链式线性表,查找其中最大的数
并输出删除释放节点,然后对剩余的进行排序,并输出释放节点。*/

/*算法思想:1.头插法建立单链表             2.顺序查找一次,找出最大值,并删除该节点
3.将剩余的进行冒泡排序(升序) 4.将排好序后的链表逐个输出 */

/*程序:*************************爱X的味道*****************************/
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
}node,*Linklist;
/*初始化空链表*/
void InitLinklist(Linklist *L)
{
*L=(Linklist)malloc(sizeof(node));
(*L)->next=NULL;
}
/*头插法建立单链表*/
void CreateFromHead(Linklist L)
{
int tmp;
node *s;
printf("please input the data! \n");
scanf("%d",&tmp);
while(0!=tmp)
{
s=(node *)malloc(sizeof(node));
s->data=tmp;
s->next=L->next;
L->next=s;
scanf("%d",&tmp);
}
printf("Input finished !\n\n");
}
/*查找最大元素并输出,并删除该节点*/
void Search(Linklist L)
{
int tmp=0;
Linklist cur=L->next,position=L,q=L;
tmp=cur->data;
position=cur;
while(cur!=NULL)
{
if(tmp<cur->data)
{
tmp=cur->data;
position=cur;
}
cur=cur->next;
}
printf("MAX is %d\n\n",tmp);
while(q->next!=position)
q=q->next;
q->next=position->next;
free(position);
}

/*剩余节点按升序排序,冒泡算法*/
void Sort(Linklist L)
{
Linklist cur,p;
if((!L->next)||(!L->next->next)) return ;
cur=L->next;p=L->next->next;
while(cur->next!=NULL)
{
while(p!=NULL)
{
if((cur->data)>(p->data))
{
cur->data=(cur->data)^(p->data);
p->data=(cur->data)^(p->data);
cur->data=(cur->data)^(p->data);
}
p=p->next;
}
cur=cur->next;
p=cur->next;
}
}
/*排序后的链表逐个输出*/
void Output(Linklist L)
{
Linklist cur;
cur=L->next;
printf("最后顺序为(升序): \n\n");
while(cur!=NULL)
{
printf("%d ",cur->data);
cur=cur->next;
}
printf("\n\n");

}
int main()
{
Linklist L;
L=NULL;
InitLinklist(&L);
CreateFromHead(L);
Search(L);
Sort(L);
Output(L);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: