这是老师出的问题,想了好久一直想不通。
我们习惯给结构体指针起别名,特指结构体头指针,方便我们分辨和区别。
LinkList head;
Lnode *p;
这样就很明显可以知道head是头指针了
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct node
{
int id;//学号
int score;//成绩
struct node *next;
}Lnode,*LinkList;//学生成绩的结构体
LinkList Create_List()//创建成绩单链表
{
LinkList head=NULL;//第一个结点
Lnode *p,*last=NULL;//last尾结点
int id,score;
printf("请输入学号,成绩(用,隔开,0结束):\n");
scanf("%ld,%d",&id,&score);
while(id!=0)//学号为0时循环结束
{
p=(Lnode *)malloc(sizeof(Lnode));//新建立数据结点
p->id=id;
p->score=score;
if(head==NULL) head=p;//第一个结点的处理
else last->next=p;//其他结点的处理
last=p;//指向新的尾结点
scanf("%ld,%d",&id,&score);
}
if(last!=NULL)
last->next=NULL;//对于非空表,最后结点的指针域放空指针
return head;
}
void Disp_List(LinkList head)//显示成绩
{
LinkList p=head;
//p=head->next;//读取第一个元素的地址存储位置,就是直接读取下一个位置的元素
while(p!=NULL)
{
printf("学号%ld,%d分→",p->id,p->score);
p=p->next;
}
printf("NULL\n");
}
void Ins_List(LinkList head,int i,int id,int score)//插入操作
{
int j=0;
Lnode *h,*p;
h=(Lnode *)malloc(sizeof(Lnode));//新开辟要插入结点
h->id=id;
h->score=score;
h->next=NULL;
p=head;
while((j<i-1)&&(p->next!=NULL))//寻找前一个位置
{
p=p->next;j=j+1;
}
if(j==i-1){h->next=p->next;p->next=h;}
else printf("插入失败!\n");
}
void Del_List(LinkList head,int i)//删除操作
{
int j=0;
LinkList p,q;
p=head;
while((j<i-1)&&(p->next!=NULL))
{
p=p->next;
j=j+1;
}
if((p->next!=NULL)&&(j==i-1))
{
q=p->next;
p->next=q->next;
free(q);
}
else printf("删除失败!");
}
main()
{
LinkList head;
int id,i,score;
head=Create_List();//创建学生成绩链表
Disp_List(head);
printf("------------------------------\n");
printf("输入要插入的位置,学号,成绩(用,隔开):");
scanf("%d,%ld,%d",&i,&id,&score);
Ins_List(head,i,id,score);//插入操作
Disp_List(head);
printf("------------------------------\n");
printf("请输入要删除信息的位置:");
scanf("%d",&i);
Del_List(head,i);//删除操作
Disp_List(head);
}
是LinkList head和Lnode *last他们都是变量指针,为什么head用LinkList来定义,而last却不用这个。