⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c1.cpp

📁 链表是一种常见的重要的数据结构,是动 态地进行存储分配的一种结构。
💻 CPP
字号:
#include<stdio.h>
#include<malloc.h>
#define NULL 0
#define LEN sizeof(struct student)
struct student
{long num;
float score;
struct student *next;
};
int n;                                               /* n为全局变量,本文件模块中各函数均可使用它   */
struct student *creat(void)    
                                                    /* 定义一个函数。此函数带回一个指向链表头的指针。 void没有形参,不要传递数值。  */
{struct student *head;
 struct student *p1,*p2;
 n=0;                                               /*n是节点个数*/
 p1=p2=(struct student *) malloc(LEN);             /* 开辟一个新单元,强制类型转换使malloc返回指针转换为指向struct student类型数据的指针*/
 scanf("%ld,%f",&p1->num,&p1->score);
 head=NULL;
  while(p1->num!=0)
  {n=n+1;
  if(n==1)head=p1;
  else p2->next=p1;
  p2=p1;
  p1=(struct student *) malloc(LEN);
  scanf("%ld,%f",&p1->num,&p1->score);
  }
  p2->next=NULL;
  return(head);
}
void print(struct student *head)              /*  形参类型修改了  */
{
	struct student *p;
	printf("\nNow,These %d records are:\n",n);
	p=head;
	if(head!=NULL)
		do
		{printf("%ld %5.1f\n",p->num,p->score);
		 p=p->next;
		}while(p!=NULL);
}
struct student *del(struct student *head,long num)  /* num 要删掉的值*/
{  struct student *p1,*p2;
   if(head==NULL)
	  {printf("\nlist null!\n");goto end;}
   p1=head;	  
   while(num!=p1->num&&p1->next!=NULL)  /*p1指向的不是所要找的结点,并且后面还有结点 */                                        
	  {p2=p1;p1=p1->next;}              /*p1后移一个结点*/
   if(num==p1->num)                     /*找到了*/
	  {if(p1==head)      
	       head=p1->next;               /*若p1指向的是表结点,把第二个结点地址赋予head*/
	   else 
		   p2->next=p1->next;           /*否则将下一结点的地址赋给前一结点的地址*/
	   printf("delete:%ld\n",num);	  
	   n=n-1;	 
	   }
	else printf("%ld not been found!\n",num); /*找不到该结点*/
end:
 	   return(head);
} 
struct student *insert(struct student *head,struct student *stud)/*函数参数head和stud。stud是一个指针变量,从实参传来待插入结点的地址给stud*/
{ struct student *p0,*p1,*p2;
  p1=head;                                  /*p1指向第一个结点*/
  p0=stud;                                 /*p0指向待插入的结点*/
  if(head==NULL)                           /*原来的链表是空表*/
  {head=p0;p0->next=NULL;}                   /*p0指向的结点作为头结点*/
  else
  {while((p0->num>p1->num)&&(p1->next!=NULL))
	  {p2=p1;                              /*p2指向刚才p1指向的结点*/
	   p1=p1->next;                        /*p1后移一个结点*/
	  }
	  if(p0->num<=p1->num)
	  {if(head==p1)head=p0;               /*插到原来第一个结点之前*/
	   else p2->next=p0;                  /*插到p2指向的节点之后*/
	   p0->next=p1;
	  }
	  else
	  {p1->next=p0;p0->next=NULL;}     /*插到最后的结点之后*/
  }
	  n=n+1;                             /*结点数加1*/
	  return(head);
}
void main()
{ struct student *head,*stu;
  long del_num;
  printf("input records:\n");
  head=creat();                                        /*返回头指针*/
  print(head);                                          /*输出全部结点*/
  printf("\ninput the deleted number:");
  scanf("%ld",&del_num);                              /*输入要删除的学号*/
     while(del_num!=0)
	 {
       head=del(head,del_num);                       /*删除后链表的头地址*/
       print(head);                                   /*输出全部结点*/
       printf("input the deleted number:");
       scanf("%ld",&del_num);
	 }
  printf("\ninput the inserted record:");
  stu=(struct student *)malloc(LEN);
  scanf("%ld,%f",&stu->num,&stu->score);
    while(stu->num!=0)
	{  head=insert(head,stu);
       print(head);
       printf("input the inserted record:");
       stu=(struct student *)malloc(LEN);
       scanf("%ld,%f",&stu->num,&stu->score);
	}
   
   /*head=insert(head,&stu);        返回地址    */
   /*print(head);                               */
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -