链表好难o(╥﹏╥)o,又加强了一下
题目:创建动态链表并且执行某些删除操作
(进入循环的图只有两个,即第一次和第二次,之后的都可以按这个思路顺推)
图:第一次进入创建动态链表循环
图:第二次进入创建动态链表循环
图:第一次进行删除操作
图:第二次删除操作
代码如下
//创建动态链表并且执行某些删除操作
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
struct stu
{
long no;
char name[10];
float g;
struct stu *next;
};
stu *creat()
{
struct stu *head=NULL;
struct stu *r=NULL,*p=NULL;
long no;
while(true)
{
scanf("%ld",&no);
if(no==0){
return head;
}
p=(stu*)malloc(sizeof(stu));
if(p==NULL){exit(0);}
gets(p->name);
getchar();
scanf("%f",&p->g);
p->next=NULL;
if(head==NULL)
{
head=p;
r=p;
}
else{
r->next=p;
r=p;
}
}
return head;
}
void del(struct stu *head)
{
if(head==NULL)
{
return;
}
struct stu *p=NULL,*r=NULL;
long no;
printf("请输入你要删除的学生的学号");
scanf("%ld",&p->no);
while(p)
{
if(no==p->no)
{
if(head==p)
{
head=p->next;
free(p);
r=p;
p=p->next;
}
else
{r->next=p->next;
free(p);
}
}
}
}
void display(struct stu *head)
{
struct stu *p;int i=0;
head=p;
while(p!=NULL)
{
printf("这是第%d个创建的结点",++i);
puts("_________________");
printf("\n");
printf("学号%ld",p->no);
printf("姓名%s",p->name);
printf("成绩%f",p->g);
printf("\n\n\n");
p=p->next;
}
}
int main()
{
struct stu *head=NULL;
head=creat();
display(head);
del(head);
display(head);
return 0;
}
今天懂了很多,一起加油吧!!!!ヾ(◍°∇°◍)ノ゙ヾ(◍°∇°◍)ノ゙