链表
- 首先,链表的使用与结构体和指针息息相关
- 还有malloc()函数(动态随机分配空间)与free()函数
- 结构体的定义
struct node{int n;struct node *next };
- n为数据域,next是指针域
- 单链表每个节点保存下一个节点的地址(struct node *next),环环相扣,因此称之为链表
- 内存中的地址可以不是连续的
定义结构体
//建立学生信息结构体模型
struct student{
char name[10];
int score;
struct student *next;
};
int count,i;//定义全局变量
创建单链表
struct student *create(){
struct student *head,*next,*now; //头指针
char flag;
printf("请输入学生姓名:");
//动态申请内存,大小为结构体大小,强制转化为struct student * 类型
head=(struct student *)malloc(sizeof(struct student));
scanf("%s",head->name );
getchar();//防止把回车读进去
printf("请输入学生分数:");
scanf("%d",&head->score );
getchar();
now=head;//当前指针为头指针
count=1;
printf("是否继续输入:"); //y or n
scanf("%c",&flag);
while(flag!='n'){
printf("请输入学生姓名:");
next=(struct student *)malloc(sizeof(struct student));
scanf("%s",next->name );
getchar();
printf("请输入学生分数:");
scanf("%d",&next->score );
getchar();
//当前指针指向下一个元素
now->next =next;
//当前指针向下一个移动
now=next;
count++;
printf("是否继续输入:"); //y or n
scanf("%c",&flag);
}
now->next =NULL; //将最后的指针指向NULL
return head;
}
上面代码可以添加元素直至输入为n
插入元素(指定位置)
struct student *insert(struct student *p){
int postion,score;
struct student *insert,*now;
//使p的值不改变
now=p;
count++;//插入则总数要加1
insert=(struct student *)malloc(sizeof(struct student));
printf("请输入插入学生姓名:");
scanf("%s",insert->name );
getchar();
printf("请输入插入的学生分数:");
scanf("%d",&insert->score );
getchar();
printf("请输入要插入的位置:");
scanf("%d",&postion);
if(postion>0){
//需要插入position-1的位置
while(postion>1){
now=now->next ;
postion--;
}
insert->next =now->next ;
now->next =insert;
}else if(postion==0){
//需要插在第一个位置的前面
p=insert;
insert->next =now;
}
return p;
}
插入元素(头插法)
struct student *insert(struct student *p){
int score;
struct student *insert,*now;
now=p;
count++;
insert=(struct student *)malloc(sizeof(struct student));
printf("请输入插入学生姓名:");
scanf("%s",insert->name );
getchar();
printf("请输入插入的学生分数:");
scanf("%d",&insert->score );
getchar();
//插入元素的下一个为之前的第一个元素
insert->next =now;
//插入后第一个元素为插入的元素
p=insert;
count++;
return p;
}
插入元素(尾插法)
struct student *insert(struct student *p){
int score;
struct student *insert,*now;
now=p;
count++;
insert=(struct student *)malloc(sizeof(struct student));
printf("请输入插入学生姓名:");
scanf("%s",insert->name );
getchar();
printf("请输入插入的学生分数:");
scanf("%d",&insert->score );
getchar();
//当当前指向的下一个不为空时 循环往后走
while(now->next !=NULL)
now=now->next ;
//将最后一个元素的下一个由空变为插入的
now->next =insert;
//插入元素的下一个指向空
insert->next =NULL;
count++;
return p;
}
删除链表中的元素
struct student *remove(struct student *p){
struct student *remove,*now;
now=p;
int n;
printf("请输入要删除第几个学生的信息:");
scanf("%d",&n);
getchar();
for(i=1;i<=count&&now->next !=NULL;i++){
//如果要删除第一个元素的话
//第一个元素则变为第一个元素的下一个
//p也为第一个元素的下一个
if(n==1){
now=now->next ;
p=now;
return p;
}
//循环,使now一直向后,找到要删除元素的前一个
//要删除的元素则为当前的下一个
//当前的下一个则为要删除的下一个
if(i==n-1){
remove=now->next;
now->next =remove->next ;
count--;//总数要减1
return p;
}
now=now->next ;
}
return 0;
}
修改元素
struct student *change(struct student *p){
struct student *now;
now=p;
int n;
printf("请输入要修改第几个学生的信息:");
scanf("%d",&n);
for(i=1;i<=count&&now!=NULL;i++){
if(i==n){
printf("请输入修改后的成绩:");
scanf("%d",&now->score );
return p;
}
now=now->next ;
}
}
查找元素
int find(struct student *p){
int n;
struct student *now;
now=p;
printf("请输入要查找第几个学生的信息:");
scanf("%d",&n);
getchar();
for(i=1;i<=count;i++){
if(i==n){
printf("要查找的学生分数为:%d",now->score );
return 0;
}
now=now->next ;
}
}
输出
void out(struct student *p){
printf("name\tscore\n");
while(1){
printf("%s\t%d\n",p->name,p->score);
if(p->next !=NULL){
p=p->next ;
}
else
break;
}
}
主函数
int main(){
struct student *p;
p=create();
printf("当前链表元素为:\n");
out(p);
p=insert(p);
printf("插入元素后最新的列表为:\n");
out(p);
p=remove(p);
printf("删除元素后最新的列表为:\n");
out(p);
p=change(p);
printf("修改元素后最新的列表为:\n");
out(p);
find(p);
return 0;
}
以上为单链表的简单应用
我的邮箱937464681@qq.com,欢迎指正