【数据结构】单链表学习笔记

开发环境:

 操作系统:Ubuntu

 编辑器:vim

编译器:gcc

调试器:gdb

代码如下:

#include<stdio.h>
#include<malloc.h>

typedef struct studentT
{
 int num;
 float score;
 struct studentT *next;
}student;

/*函数名:create*/
/*功能:返回指向链表头节点的指针*/
/*输入:无*/
/*输出:无*/
student *create()
{
 student *head;
 student *p,*tail;
/* float temp;*/
 head=NULL;
 do
 {
  p=(student *)malloc(sizeof(student));
  scanf("%d %f",&p->num,&p->score);
  if(p->num==0)
  {
   free(p);
   break;
  }/*非法数据删除地址空间*/
/*  p->score=temp;*/
  p->next=NULL;
  if(head==NULL)
   {head=p;tail=p;}/*第一个数据插入表头*/
  else
   {tail->next=p;tail=p;}/*新结点插入表尾*/
 }while(p->num!=0);
 return head;
}

/*函数名:display*/
/*功能:打印链表中所有的元素*/
/*输入:无*/
/*输出:链表中所有的数据*/
void display(student *head)
{
 student *p;
 p=head;
 while(p!=NULL)
 {
  printf("%4d %5.1f",p->num,p->score);
  p=p->next;
 }/*数据链表实现遍历*/
 printf("\n");
}

/*函数名:insert*/
/*功能:按学号顺序插入数据*/
/*输入:无*/
/*输出:无*/
student *insert(student *head,student *new)
{
 student *p,*q;
 if(head==NULL)
  head=new;
 else
 {
  if(head->num>=new->num)
  {
   new->next=head;
   head=new;
  }/*学号小的放在链首*/
  else
  {
   p=head;
   while(p->num<new->num&&p->next!=NULL)
   {
    q=p;
    p=p->next;
   }/*循环直到待插入结点的学号小于前一结点的学号*/
   if(p->num>new->num)
   {
    q->next=new;
    new->next=p;
   }
   else
   {
    p->next=new;
    new->next=NULL;
   }/*该结点插入到链表的尾部*/
  }
 }
 return head;
}

/*函数名:delete*/
/*功能:删除指定学号的数据*/
/*输入:无*/
/*输出:无*/
student *delete(student *head,int num)
{
 student *p1,*p2;
 if(head==NULL)
  printf("ERROR\n");
 else
 {
  p1=head;
  while(num!=p1->num&&p1->next!=NULL)
  {
   p2=p1;
   p1=p1->next;
  }/*查找学号为num的结点*/
 if(num==p1->num)
 {
  if(p1==head)
   head=p1->next;/*删除头结点*/
  else
   p2->next=p1->next;/*下一结点的地址赋值给前一结点的指针域*/
 free(p1);/*释放内存空间*/
 }
 else
  printf("ERROR\n");
 }
 return head;
}


/*函数名:main*/
/*功能:建立学生成绩单链表,实现对记录的遍历、插入、插入*/
/*输入:无*/
/*输出:打印成绩单链表*/
int main()
{
 student *l,*temp;
 int temp1=0;
 l=create();/*建立成绩单链表*/
 display(l);/*遍历单链表*/
 temp=(student *)malloc(sizeof(student));
 scanf("%d %f",&temp->num,&temp->score);
 temp->next=NULL;
 l=insert(l,temp);/*插入一个结点*/
 display(l);/*打印单链表*/
 scanf("%d",&temp1);/*读入要删除的学号*/
 delete(l,temp1);
 display(l);/*打印删除结点后的单链表*/
 return 1;

}


测试:

1、建立成绩单链表(0 0结束输入),并打印:

 

2、插入学号4的数据,并打印:

3、删除学号4的数据,并打印:

程序基本实现功能。

 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值