面试(一)

/*
面试(一)
开发环境: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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值