先看实操
#include <stdlib.h>
#include <stdio.h>
typedef struct student{
char number[99];
char name[99];
struct student *next;
}stu;
stu *head=NULL;//头指针
stu *end=NULL;//尾指针
void add(){
stu *ap;
ap=(stu *)malloc(sizeof(stu));//这里创建节点
printf("输入学号和姓名");
scanf("%s",ap->name);
scanf("%s",ap->number);
ap->next=NULL;
if(head==NULL){//先进行判断
head=ap;
end=ap;
}
else {
end->next=ap;
end=ap;
}
}
int main(){
printf("是否添加学生(1添加,2否):");
int a;
scanf("%d",&a);
if(a==1){
add();
}
}
这里用到的是尾插法,及在尾指针上面进行操作。
一 添加的原理
1.先定义头指针和尾指针来确定链表的位置(全局变量来定义更好操作)
2.然后添加一个元素进来,就使尾指针的next指针域指向这个节点(首先判断这个链表是否有元素,不然的话头尾都是空指针)
3.这里需要注意,两个指针之间使用“ a=b ”时,那么a和b存放的地址相同,及对end操作的时候就是在对最后一个元素进行操作。
二 使用方法
1.比如查找链表中某一个元素时
void fundname(){
char a[999]; //这里假设按姓名去查找链表中的元素
int flag=0;
printf("请输入姓名:");
scanf("%s",a);
stu *ap=head; //这里不能直接用head头指针,因为下面会改变这个,但是头指针不能变。
while(ap!=NULL){ //这里只要不是最后一个元素都要进行检查
if(strcmp(ap->name,a)==0){ //这里进行比较,倘若相同就进行下一步
printf("学生的信息为:\n");
printf("学号为%s\n",ap->number);
flag=1;
}
ap=ap->next; //这里是对下一个元素进行检查。
}
if(flag==0){
printf("没有查询到学生信息\n");
}
}
就是从头指针进行挨个查找。
三 进行删除
void delete(){
stu *ap=head;
stu *tmp=NULL;
printf("请输入要删除的学生的学号:"); //这里假设进行学号删除
char dnumber[99];
scanf("%s",dnumber);
while(ap!=NULL){
if(strcmp(ap->number,dnumber)==0){
tmp->next=ap->next; //原本的tmp是现在ap的前一个,那么本来tmp->next=ap,现在tmp->next=ap->next,所以ap被覆盖
break;
}
tmp=ap; //记录每一次*ap变换前的位置
ap=ap->next;
}
printf("删除成功\n");
}
主要原理就是要进行覆盖