c语言练习题 练习2 3 4

c语言练习题练习234要完整的代码谢谢了... c语言练习题 练习2 3 4要完整的代码 谢谢了 展开
 我来答
自我编程
2018-02-04 · 科技优质答主
自我编程
采纳数:1481 获赞数:4283

向TA提问 私信TA
展开全部

完全按照你题意写的。题目中元素  就是指 我代码中的链表节点!

注释我已经写的不能再详细了。你应该能看得懂。

#include<stdio.h>
#include<malloc.h>
#include<string.h>

typedef struct entry
{
    int id;//你没有告诉我entry结构成员是什么,我随便定义几个个成员意思意思,你自己改吧!!!!!!!!
    char name[11];
    int score;
    struct entry *next;
}ETY;
void printfEntry(ETY **etyHeadPoint);//打印链表

ETY *findEntry(ETY **etyHeadPoint,int id);//既然题意要求insertEntry参数2是指定节点,那么就必须有函数能找出指点节点地址
//参数1成员id值  我这里通过id查找节点,     找到返回节点地址,如果没找到 返回NULL

int insertEntry(ETY *etyHead,ETY *ety);//参数1:指向头节点指针的指针
//参数2:指定的节点指针,新节点将插在该节点之后,如果是NULL则新节点直接插在首节点位置
//返回0 创建了首节点   返回1 顶替了首节点位置   返回2 插入了指定节点后面   返回3 异常

int removeEntry(ETY *ety);//按照题意  只有1个参数就是指定的节点。  函数将根据参数 删除该节点之后的节点 或删除首节点
//参数:想要删除的节点的前一个节点   如果传参是头节点将删除首节点   返回0 首节点删除成功 返回1 非首节点删除成功   返回2 无节点删除

int id;//成员ID我直接全局自增,遍历节点用
int main()
{
    ETY *etyHead=(ETY *)malloc(sizeof(ETY));//定义链表头节点指针,头结点不存储数据仅指向首节点,用于链表遍历
    etyHead->id=-1;//将-1作为判断头节点的值  用于删除
    etyHead->next=NULL;
    ETY *etyBYid;
    int findId,re;
    id=0;

    printf("第一次插入,先创建个首节点\n");
    re=insertEntry(etyHead,NULL);
    printf("执行后,链表内容为:\n");
    printfEntry(&(etyHead));
    printf("\n\n\n");

    printf("在链表开头插入了一个新节点顶替首节点位置,节点后移\n");
    re=insertEntry(etyHead,NULL);
    printf("执行后,链表内容为:\n");
    printfEntry(&(etyHead));
    printf("\n\n\n");

    while(1)
    {
        printf("指定节点,并在其后再插入1个新节点\n");
        printf("输入一个已有节点的ID(输入-1 结束当前插入操作):");
        scanf("%d",&findId);
        if(findId<0)
        {
            printf("\n\n\n");
            break;
        }
        etyBYid=findEntry(&(etyHead),findId);
        if(etyBYid==NULL)
        {
            printf("ID不存在,请重新输入!\n");
            continue;
        }
        re=insertEntry(etyHead,etyBYid);
        if(re==2)
            printf("在ID=%d的节点后面插入了ID=%d的新节点\n",findId,id-1);
        printf("执行后,链表内容为:\n");
        printfEntry(&(etyHead));
        printf("\n\n\n");
    }

    printf("程序执行删除首节点!!\n");
    re=removeEntry(etyHead);
    printf("执行后,链表内容为:\n");
    printfEntry(&(etyHead));
    printf("\n\n\n");


    while(1)
    {
        printf("指定一个节点,程序将删除该节点之后的一个节点\n");
        //返回0 首节点删除成功 返回1 非首节点删除成功   返回2 无节点删除
        printf("输入一个已有节点的ID(输入-1 结束当前插入操作):");
        scanf("%d",&findId);
        if(findId<0)
        {
            printf("\n\n\n");
            break;
        }
        etyBYid=findEntry(&(etyHead),findId);
        if(etyBYid==NULL)
        {
            printf("ID不存在,请重新输入!\n");
            continue;
        }
        re=removeEntry(etyBYid);
        printf("执行后,链表内容为:\n");
        printfEntry(&(etyHead));
        printf("\n\n\n");
    }


    return 0;
}
void printfEntry(ETY **etyHeadPoint)//打印链表
{
    int count=1;
    ETY *etyHead=*(etyHeadPoint);
    ETY *etyHeadSave=etyHead;
    while(etyHead->next!=NULL)
    {
        printf("节点%d  ID:%d  姓名:%s  分数:%d\n",count++,etyHead->next->id,etyHead->next->name,etyHead->next->score);
        etyHead=etyHead->next;
    }
    etyHead=etyHeadSave;
}
ETY *findEntry(ETY **etyHeadPoint,int id)//参数1:指向头节点指针的指针   参数2:用于查找的成员id值
{
    ETY *etyHead=*(etyHeadPoint);
    ETY *etyHeadSave=etyHead;
    ETY *theETY;
    while(etyHead->next!=NULL)
    {
        theETY=etyHead->next;
        if(theETY->id==id)
        {
            etyHead=etyHeadSave;
            return theETY;
        }
        etyHead=etyHead->next;
    }
    etyHead=etyHeadSave;
    return NULL;
}
int removeEntry(ETY *ety)
//参数:想要删除的节点的前一个节点   如果传参是头节点将删除首节点   返回0 首节点删除成功 返回1 非首节点删除成功   返回2 无节点删除
{
    int re;
    if(ety->next==NULL)
    {
        printf("该节点已是最后一个节点,无节点删除!\n");
        return 2;
    }
    if(ety->id==-1)//如传参是头节点  删除首节点
    {
        printf("传参为头节点,将ID=%d的首节点!\n",ety->next->id);
        re=0;
    }
    if(ety->next!=NULL)
    {
        printf("将该节点之后的ID=%d的节点删除!\n",ety->next->id);
        re=1;
    }
    ETY *etyDEL=ety->next;//将要删除的节点
    ETY *etyDELnext=etyDEL->next;//保存删除节点之后的节点
    ety->next=etyDELnext;//重组链表
    etyDEL->next=NULL;//删除节点
    free(etyDEL);//释放内存
    etyDEL=NULL;
    return re;
}
//参数1:头节点指针   参数2:指定的节点指针,新节点将插在该节点之后,如果是NULL则新节点直接插在首节点位置
//返回0 创建了首节点   返回1 顶替了首节点位置   返回2 插入了指定节点后面   返回3 异常
int insertEntry(ETY *etyHead,ETY *ety)
{

    ETY *etyNew=(ETY *)malloc(sizeof(ETY));
    if(etyNew==NULL)
    {
        printf("内存申请失败!!");
        return 3;
    }
    etyNew->id=id;
    printf("分别输入新节点 姓名(最多10字符)、分数:");
    scanf("%s%d",etyNew->name,&(etyNew->score));
    etyNew->next=NULL;
    id++;
    if(ety==NULL)
    {
        if(etyHead->next==NULL)//创建首节点
        {
            etyHead->next=etyNew;
            return 0;
        }
        else//顶替首节点位置  首节点后移
        {
            etyNew->next=etyHead->next;
            etyHead->next=etyNew;
            return 1;
        }
    }
    else// 在现有节点后面插入
    {
        etyNew->next=ety->next;
        ety->next=etyNew;
        return 2;
    }

}
更多追问追答
追问
可以告诉我那个代码是那一题
这个有点乱
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式