面试(一)
2016-06-05 16:41
429 查看
/*
面试(一)
开发环境:Visual Studio 2008
开发语言:C语言
要 求:使用C语言(不带头结点)单向链表模拟STL中的ForwardList大致功能。
时 间:15-20分钟
*/
面试(一)
开发环境:Visual Studio 2008
开发语言:C语言
要 求:使用C语言(不带头结点)单向链表模拟STL中的ForwardList大致功能。
时 间:15-20分钟
得分标准: 1.建立链表(5分) 2.输出链表(5分) 3.释放链表(10分) 4.链表头部插入(10分) 5.链表尾部插入(10分) 6.链表头部删除(10分) 7.链表尾部删除(10分) 8.链表排序(通过指针实现)(30分) 9.口述算法 考核标准: 1.建立(不带头结点)单向链表后,未释放结点空间。(0分) 2.口述算法思路不清晰者(0分) 3.无错误模拟push_front()、push_back()、pop_front()、pop_back(),其中函数名称与STL名称一致的可适当加分。 4.无错误模拟sort(),并通过指针排序直接加分(数据交换排序不得分,错误扣分)。 考核小组:张一涛 批注评语:forwardlist容器是没有push_back()和pop_back()操作的。请查看《C++标准库第2版》侯捷 【译】第306页,有关forwardlist容器使用及说明,请参考《C++标准库第2版》的第300页至第313页。
*/
#include <stdio.h> #include <stdlib.h> #define scanf scanf_s typedef struct LinkList { int data; struct LinkList *next; }ForwardList; ForwardList *Create() { ForwardList *p,*h=NULL; p=(ForwardList *)malloc(sizeof(ForwardList)); scanf("%d",&p->data); while(p->data!=0) { p->next=h; h=p; p=(ForwardList *)malloc(sizeof(ForwardList)); scanf("%d",&p->data); } return (h); } void Show(ForwardList *h) { ForwardList *p; p=h; while(p!=NULL) { printf("%d ",p->data); p=p->next; } printf("\n"); } void Clear(ForwardList *h) { ForwardList *p; p=h; while(p!=NULL) { h=h->next; free(p); p=h; } } ForwardList *push_front(ForwardList *h,int num) { ForwardList *p; p=(ForwardList *)malloc(sizeof(ForwardList)); p->data=num; p->next=h; h=p; return (h); } void push_back(ForwardList *h,int num) { ForwardList *p,*q; p=h; while(p->next!=NULL) p=p->next; q=(ForwardList *)malloc(sizeof(ForwardList)); q->data=num; p->next=q; q->next=NULL; } ForwardList *pop_front(ForwardList *h) { ForwardList *p; p=h; h=h->next; free(p); return (h); } void pop_back(ForwardList *h) { ForwardList *p,*q; p=h; while(p->next!=NULL) { q=p; p=p->next; } q->next=NULL; free(p); } ForwardList *sort(ForwardList *h) { ForwardList *p,*q,*t; ForwardList *Nh=NULL; while(h!=NULL) { if(Nh==NULL) { Nh=h; h=h->next; Nh->next=NULL; } else { if(Nh->data<=h->data) { p=h; h=h->next; p->next=Nh; Nh=p; } else { p=Nh; q=Nh; while(p!=NULL&&p->data>h->data) { q=p; p=p->next; } if(p==NULL) { t=h; h=h->next; q->next=t; t->next=NULL; } else { t=h; h=h->next; q->next=t; t->next=p; } } } } return (Nh); } void main() { ForwardList *h; int num; h=Create(); printf("The ForwardList:\n"); Show(h); printf("Please input data (push_front):\n"); scanf("%d",&num); h=push_front(h,num); printf("Please input data (push_back):\n"); scanf("%d",&num); push_back(h,num); printf("(push_front) and (push_back) The ForwardList:\n"); Show(h); printf("pop_front\n"); h=pop_front(h); printf("pop_back\n"); pop_back(h); printf("(pop_front) and (pop_back) The ForwardList:\n"); Show(h); printf("Sort The ForwardList:\n"); h=sort(h); Show(h); Clear(h); }
相关文章推荐
- 剑指Offer----面试题24:二叉搜索树的后序遍历序列
- Android面试题整理
- java面试笔试题整理
- Java笔试题库之编程题库 总共30道编程题,掌握了就可以应付中级以内Java面试题
- 剑指Offer----面试题23:从上往下打印二叉树(层序遍历)
- PHP面试总结
- 机器学习面试题总结
- 剑指Offer----面试题22:栈的压入、弹出序列
- Android面试题及其答案(二)
- java的面试题:缓冲池(-128~127)
- 面试题16:反转链表
- 程序员必读经典书籍
- <笔试><面试>判断一个数是否在40亿个中
- 笔试面试成对出现的一组数,只有一个或两个只出现一次的数字,找到它们。
- <笔试><面试>编写一个排序函数,实现,既可以排序整形数组,又可以排序字符串。
- <笔试><面试>单链表相关(1)从尾到头打印链表、删除一个无头链表的非尾结点
- 笔试面试单链表相关(2)在任意位置前插入结点、逆置链表
- 笔试面试,单链表相关(3)遍历一次找中间结点、倒数第K个结点
- 机器学习算法知识梳理--面试
- Java程序员必须掌握的排序算法Java实现整合一 :插入排序