茂一彭于晏 2022-03-17 12:15 采纳率: 75%
浏览 29
已结题

动态链表无法在第一个结点处插入和删除数据,如何解决?

如题,代码如下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN sizeof(Student)

typedef struct {
int num; //8位学号
char name[20]; //姓名
int score; //成绩
}Student;

typedef struct LNode{
Student data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;

LNode *Create(){ //创建动态链表
int n=0;
LinkList head;
LNode p1,p2;
n=0;
p1=p2=(LNode
)malloc(LEN);
scanf("%s%d%d",p1->data.name,&p1->data.num,&p1->data.score);
head=NULL;
while(p1->data.num!=0)
{
n=n+1;
if(n==1)
{
head=p1;
}
else
{
p2->next=p1;
}
p2=p1;
p1=(struct LNode
)malloc(LEN);
scanf("%s%d%d",p1->data.name,&p1->data.num,&p1->data.score);
}
p2->next = NULL;
return head; //返回类型为LNode类型而不是LinkList类型;
}

void PrintList(LNode *head){ //打印链表数据
LNode *p;
p=head;
if(head!=NULL)
{
do
{
printf("%s %d %d\n",p->data.name,p->data.num,p->data.score);
p=p->next;
}while(p!=NULL);
}
}

void SearchData(LNode *head){ //根据姓名查找相关数据
LNode *p;
p=head;
char x[20];

printf("请输入姓名:");
scanf("%s",x);

for(;p!=NULL;p=p->next)
   {   if(strcmp(p->data.name,x)==0)
          printf("%s %d %d\n",p->data.name,p->data.num,p->data.score);
       
   }
    

}

void SearchLocation(LNode *head){ //根据指定位置输出学生信息
int x,n;
LNode *p;
p=head;

 printf("请输入需要输出学生信息的位置:");
 scanf("%d",&x);
 
 for(n=1;p!=NULL;p=p->next,n++)
     {  

        if(x==n)
        printf("该位置学生数据为:%s %d %d\n",p->data.name,p->data.num,p->data.score);
        
 }
        
  

}

void InsertData(LNode *head){ //将给定的学生信息插入到表中指定位置
int x,n;
LNode *p,s;
p=head;
s=(LNode
)malloc(LEN);
printf("请输入需要插入的位置:");
scanf("%d",&x);
printf("请输入需要插入的数据(格式:名字/学号/成绩):");
scanf("%s%d%d",s->data.name,&s->data.num,&s->data.score);

 for(n=1;p!=NULL;p=p->next,n++)
     {    if(x==n+1)
           {    s->next=p->next;
               p->next=s;
                printf("插入成功\n"); 
            }
         
     }
 
 
   

}
void DeleteData(LNode *head){ //删除指定位置的学生记录
int x,n;
LNode *p;
p=head;
printf("请输入需要删除的位置:");
scanf("%d",&x);

 for(n=1;p!=NULL;p=p->next,n++)
     {    if(x==n+1)
         {    
             p->next=p->next->next;
             
             printf("删除成功\n");             
         }
         
      } 
 

}

int main(){
int x;
LNode *head;
printf("请输入学生的数据(格式:名字/学号/成绩):");
head=Create();

printf("\n");

printf("1.插入元素\n");
printf("2.查找元素\n");
printf("3.打印链表元素\n");
printf("4.删除元素\n");
printf("5.查找相关位置学生信息\n");
printf("0.退出\n");
printf("请输入你想要进行的操作:");
scanf("%d",&x);

while(x!=0)
{
switch(x)
{ case 1:InsertData(head);break;
case 2:SearchData(head);break;
case 3:PrintList(head);break;
case 4:DeleteData(head);break;
case 5:SearchLocation(head);break;
default:printf("error!");

}
printf("请输入需要执行的功能选项:"); 
scanf("%d",&x); 

}
return 0;
}

  • 写回答

1条回答 默认 最新

  • 快乐鹦鹉 2022-03-17 13:06
    关注

    你的插入和删除节点函数中,head指针都没有被修改,怎么可能实现第一个节点的插入和删除呢?
    你要针对第一个节点做特殊判断和处理,比如删除第一个节点,应该是head = head->next,然后函数应该增加返回值,和Create一样,最后return head;main中应该是head = DeleteData(head);这样子

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 3月25日
  • 已采纳回答 3月17日
  • 创建了问题 3月17日

悬赏问题

  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮