1个回答
展开全部
完全按照你题意写的。题目中元素 就是指 我代码中的链表节点!
注释我已经写的不能再详细了。你应该能看得懂。
#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;
}
}
更多追问追答
追问
可以告诉我那个代码是那一题
这个有点乱
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询