链表的创建以及其增删改查

链表

  • 首先,链表的使用与结构体指针息息相关
  • 还有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,欢迎指正

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值