电话:0731-83595998
导航

C语言初学者入门知识之结构体3 4

来源: 2017-10-20 13:08

  1. 原表是空表,只需使head指向被插结点即可。

  2. 被插结点值最小,应插入第一结点之前。这种情况下使head指向被插结点,被插结点的指针域指向原来的第一结点则可。即:

  pi->next=pb;

  head=pi;

  3. 在其它位置插入。这种情况下,使插入位置的前一结点的指针域指向被插结点,使被插结点的指针域指向插入位置的后一结点。即为:pi->next=pb;pf->next=pi;

  4. 在表末插入。这种情况下使原表末结点指针域指向被插结点,被插结点指针域置为NULL。

  即:

  pb->next=pi;

  pi->next=NULL; TYPE * insert(TYPE * head,TYPE *pi)

  {

  TYPE *pf,*pb;

  pb=head;

  if(head==NULL) /*空表插入*/

  (head=pi;

  pi->next=NULL;}

  else

  {

  while((pi->num>pb->num)&&(pb->next!=NULL))

  {

  pf=pb;

  pb=pb->next;

  }/*找插入位置*/

  if(pi->numnum)

  {

  if(head==pb)head=pi;/*在第一结点之前插入*/

  else pf->next=pi;/*在其它位置插入*/

  pi->next=pb; }

  else

  {

  pb->next=pi;

  pi->next=NULL;

  } /*在表末插入*/

  }

  return head;

  }

  本函数有两个形参均为指针变量,head指向链表,pi 指向被插结点。函数中首先判断链表是否为空,为空则使head指向被插结点。表若不空,则用while语句循环查找插入位置。找到之后再判断是否在第一结点之前插入,若是则使head 指向被插结点被插结点指针域指向原第一结点,否则在其它位置插入, 若插入的结点大于表中所有结点,则在表末插入。本函数返回一个指针,是链表的头指针。当插入的位置在第一个结点之前时, 插入的新结点成为链表的第一个结点,因此head的值也有了改变, 故需要把这个指针返回主调函数。

  [例7.14]将以上建立链表,删除结点,插入结点的函数组织在一起,再建一个输出全部结点的函数,然后用main函数调用它们。

  #define NULL 0

  #define TYPE struct stu

  #define LEN sizeof(struct stu)

  struct stu

  {

  int num;

  int age;

  struct stu *next;

  };

  TYPE * creat(int n)

  {

  struct stu *head,*pf,*pb;

  int i;

  for(i=0;i

  {

  pb=(TYPE *)malloc(LEN);

  printf("input Number and Agen");

  scanf("%d%d",&pb->num,&pb->age);

  if(i==0)

  pf=head=pb;

  else pf->next=pb;

  pb->next=NULL;

  pf=pb;

  }

  return(head);

  }

  TYPE * delete(TYPE * head,int num)

  {

  TYPE *pf,*pb;

  if(head==NULL)

  {

  printf("nempty list!n");

  goto end;

  }

  pb=head;

  while (pb->num!=num && pb->next!=NULL)

  {

  pf=pb;pb=pb->next;

  }

  if(pb->num==num)

  {

  if(pb==head) head=pb->next;

  else pf->next=pb->next;

  printf("The node is deletedn");

  }

  else

  free(pb);

  printf("The node not been found!n");

  end:

  return head;

  }

  TYPE * insert(TYPE * head,TYPE * pi)

  {

  TYPE *pb ,*pf;

  pb=head;

  if(head==NULL)

  {

  head=pi;

  pi->next=NULL;

  }

  else

  {

  while((pi->num>pb->num)&&(pb->next!=NULL))

  {

  pf=pb;

  pb=pb->next;

  }

  if(pi->numnum)

  {

  if(head==pb) head=pi;

  else pf->next=pi;

  pi->next=pb;

  }

  else

  {

  pb->next=pi;

  pi->next=NULL;

  }

  }

  return head;

  }

  void print(TYPE * head)

  {

  printf("NumberttAgen");

  while(head!=NULL)

  {

  printf("%dtt%dn",head->num,head->age);

  head=head->next;

  }

  }

  main()

  {

  TYPE * head,*pnum;

  int n,num;

  printf("input number of node: ");

  scanf("%d",&n);

  head=creat(n);

  print(head);

  printf("Input the deleted number: ");

  scanf("%d",&num);

  head=delete(head,num);

  print(head);

  printf("Input the inserted number and age: ");

  pnum=(TYPE *)malloc(LEN);

  scanf("%d%d",&pnum->num,&pnum->age);

  head=insert(head,pnum);

  print(head);

编辑推荐:

下载Word文档

温馨提示:因考试政策、内容不断变化与调整,长理培训网站提供的以上信息仅供参考,如有异议,请考生以权威部门公布的内容为准! (责任编辑:长理培训)

网络课程 新人注册送三重礼

已有 22658 名学员学习以下课程通过考试

网友评论(共0条评论)

请自觉遵守互联网相关政策法规,评论内容只代表网友观点!

最新评论

点击加载更多评论>>

精品课程

更多
10781人学习

免费试听更多

相关推荐
图书更多+
  • 电网书籍
  • 财会书籍
  • 其它工学书籍
拼团课程更多+
  • 电气拼团课程
  • 财会拼团课程
  • 其它工学拼团
热门排行

长理培训客户端 资讯,试题,视频一手掌握

去 App Store 免费下载 iOS 客户端