C语言链表的优化
希望有大佬可以帮我优化一下链表的代码或者可以为我提供一些好的建议,总感觉代码太长了而且学的也比较少,本人水平有限,代码已经粘贴好了,下面的代码实现了链表的动态创建、插入、删除和输出#include <stdio.h>
#include <malloc.h>
#define LEN sizeof(struct student)
#define NUM 10
int n=0;//定义全局变量表示节点的序号数
struct student
{
long num;
int score;
int age;
struct student *next;
};
struct student *creat()//链表的创建
{
struct student *p1,*p2,*head;
head=NULL;//意思是现在的链表为空
p1=p2=(struct student*)malloc(LEN);//让指针p1,p2指向新开辟的一个空间
printf("请输入学生学号、分数和年龄:\n");
scanf("%ld%d%d",&p1->num,&p1->score,&p1->age);
while(p1->num!=0)
{
n++;
if(n==1){head=p1;}//如果是第一个节点就让head指向p1
else {p2->next=p1;}//如果不是第一个节点就让上一个节点的指针域指向下一个节点
p2=p1;//让p2也指向下一个部分的地址
p1=(struct student*) malloc(LEN);//再开辟一个新的空间
printf("该学生的信息已经存好\n");
scanf("%ld%d%d",&p1->num,&p1->score,&p1->age);
}
p2->next=NULL;//当输入的学号为0的时候,表示链表最后一个节点的指针域指向NULL,链表创建完成
printf("学生信息已经存储好!\n");
return (head);
}
struct student *del(struct student *head)//链表的删除操作
{
int num1;//学生学号
struct student *p=head,*p3=head;
printf("请输入你想要删除的学生的学号:");
scanf("%d",&num1);
if (head==NULL)
{
printf("没有存任何学生的信息");
return (head);
}
while(num1!=p->num && p->next!=NULL){p3=p;p=p->next;}//如果p指向的不是要删除的节点,且还存在下一个节点,就让p指向下一个节点,并让p3指向当前节点
if(p==head)
{
head=p->next;
}//如果要删除第一个节点的信息,就让head指向下一个节点,若接下来没节点,则 p->next的值就为NULL
else
{
if(num1==p->num )
{
p3->next=p->next;
}
else
{
printf("输入的学号不存在!");
}
} //否则直接让前一个节点的指针指向下下个节点
return (head);
}
struct student *insert(struct student *head)//链表的插入操作
{
int n2=0;//
int n1;//和n2进行比较 ,n1为用户输入的节点序号,表示想要添加节点到第几个节点后面,n1=0就是直接添加到最前面
struct student *p=head,*p3,*p4=head;
if (head==NULL)
{
printf("没有存任何学生的信息");
return head;
}
printf("请输入你想要添加学生的信息添加到第几个学生的后面:");
scanf("%d",&n1);
while(true)
{
if (n1==0)//如果要在最前面添加信息
{
p3=(struct student*) malloc(LEN);
printf("请输入学生学号、分数和年龄:\n");
scanf("%ld%d%d",&p3->num,&p3->score,&p3->age);
head=p3;
p3->next=p;
break;
}
else if(n1==n && n2==n)//如果添加到最后面
{
p3=(struct student*) malloc(LEN);
printf("请输入学生学号、分数和年龄:\n");
scanf("%ld%d%d",&p3->num,&p3->score,&p3->age);
p4->next=p3;
p3->next=NULL;
break;
}
else
{
if(n1==n2)
{
p3=(struct student*) malloc(LEN);//开辟一个新的学生信息区域
printf("请输入学生学号、分数和年龄:\n");
scanf("%ld%d%d",&p3->num,&p3->score,&p3->age);
p4->next=p3; //让前一个学生信息区域的指针指向域的指针指向新的学生信息区域
p3->next=p;//让新的学生信息区域的指针域的指针指向后一个学生信息区域
break;
}
p4=p3=p;//此时p3、p4指向的节点序号为n2
n2++;
p=p->next;//需要注意的是此时p指向的节点序号为n2+1
}
}
return (head);
}
struct student *print(struct student *head)//输出链表
{
struct student *p=head;
printf("输出学生信息:\n");
while(p!=NULL)
{
printf("%ld\t%d\t%d\n",p->num,p->score,p->age);
p=p->next;//让p指向下一个区域的指针域
}
}
int main()
{
struct student *head;
head=creat();//创建链表
print(head);//输出链表
head=insert(head);//增添一个学生的信息
print(head); //输出链表
head=del(head);//删除一个学生的信息
print(head); //输出链表
return 0;
}