简易链表(插入\删除\增加结点)

 我的想法是建立一个学生的绩点的查询表,后期可能会把功能做的全面一些。

          现存的功能有   我是根据按键的输入(1~9) 现在有的按键的功能为    9.退出    1.插入数据   2.删除数据  3.查找数据

           结构体的数据包括 :学生的id(学号)  学生名字   绩点           

          每个功能单独写成一个函数,然后再写一个函数专门用来调用这些函数。当然特殊情况另外处理。

                               各个功能的实现原理:

                               1.退出的话,就是输入9之后,判定是9就什么输出结束的问候语句。

                               2.插入数据的话,就是把链表中最后一个元素 指向插入的数据。

 

                               3.删除数据的话就是使前一个结点指向当前后面一个结点,跳过要删除的那个结点

                                   

                          4.查找的话就是按照链表一个一个往下找,知道到最后一个结点。

#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct Student)
 
struct Student
{
	int num;
	char name[15];
	float aver;
	struct Student *next;
};

//struct Student *head;

int n;   //记录数 

//====================================\\
//              构建链表               
struct Student *creat()
{
	 struct Student *head1;
	 struct Student *p1,*p2;
	 n=0;
	 p1=p2=(struct Student* )malloc(LEN);
	 scanf("%d%s%f",&p1->num,p1->name,&p1->aver);
	 head1=NULL;
	 while(p1->num!=0)
	 {
 		n=n+1;
 		if(n==1) head1=p1;
 		else p2->next=p1;
 		p2=p1;
 		p1=(struct Student*)malloc(LEN);
 		scanf("%d%s%f",&p1->num,p1->name,&p1->aver);
 	}
 	p2->next=NULL;
 	return(head1);
	 	 
}

//=====================================\\
//         打印输出链表                 
void print(struct Student *head)
{
	struct Student *p;
	printf("\nNow,These %d records are:\n",n);
	printf("student id       name             grade point aver\n");
	p=head;
	if(head!=NULL)
	  do
  	 {
  	     printf("%10d       %-15s%9.2f\n",p->num,p->name,p->aver);
		 p=p->next;	
     }while(p!=NULL);
}
//=============================\\
//        插入结点  根据学号大小插入
 void insert(struct Student *head)
{
	struct Student *p=head;
	struct Student *p1,*t=head;
	printf("\n请输入要插入的数据:\n");
	while(p->next!=NULL)
	{
	   p=p->next;	
	}
	p1=(struct Student *)malloc(LEN);
  s:scanf("%d%s%f",&p1->num,p1->name,&p1->aver);
	p1->next=NULL;
	p->next=p1;
    //scanf("%d%s%f",&p1->num,p1->name,&p1->aver);
    //printf("%.2f\t%.2f",p->aver,p1->aver);
    
	while(t->num!=p1->num)
	{
	    t=t->next;	
	}
	if(t!=p1)
	{
		printf("输入的数据已存在请重新输入:\n");
	  	goto s;
	}
	n=n+1;
	//p->next=p1;
	//p1->next=NULL;
	printf("\n插入完后的新数据"); 
	print(head);

	
}

 
//===================================、、
//        根据学生的id 删除结点
struct Student *  dele(struct Student *head)
{
	int flag,single=0,i=0,j;
	struct Student *p=head;
	struct Student *p1=head;
	printf("输入删除的结点(学号):\n");
	scanf("%d",&flag);
	while(p->next!=NULL)
	{
		i=i+1;
		if(p->num==flag)
		{
           n=n-1;
	       single=1;     		
		   break;
		}
		p=p->next;
	}
	if(!single) printf("输入的结点错误(学生id不存在或已删除)\n");
	else
	{
		if(p==head) head=p->next;
		else
		{
			for(j=1;j<i-1;j++)
			{
				p1=p1->next;
			}
			p1->next=p->next;
		}
		print(head);
	}
	return  head; 
}

 
//===================================\\
//        根据学生id 查找结点 
 void search(struct Student *head)
{
	int numb,i=0,j,flag=0;
	struct Student *p=head;
	struct Student *p1=head;
    printf("\n请输入要查找的结点(学号):\n");
	scanf("%d",&numb);
	while(head!=NULL)
	{
		i=i+1;
		if(p1->num==numb) 
		{
		  flag=i;
		  break; 
		} 
		p1=p1->next;
	}
	if(!flag) printf("输入错误 表中没有这个学号");
	else 
	{
		for(j=1;j<i;j++) p=p->next;   
	    printf("%10d       %-15s%9.2f\n",p->num,p->name,p->aver);
	} 
		
}
int main()
{
	void function (struct Student *head,int n);
	int flag;
    struct Student *head;
	printf("输入学生的id 姓名 绩点 (初始化链表 输入0 0 0表示初始化结束)\n");
	head=creat();
	print(head);
 t:	printf("\n是否要执行下一部功能(按下对应的键):\n9.退出 1.插入数据 2.删除数据 3.查找数据:");
	scanf("%d",&flag);
	if(flag!=9&&flag!=2)
	{
	   function(head,flag);
	   goto t;
	}
	else if(flag==2)
	{
		head=dele(head);
		goto t;
	} 
	else  printf("拜拜嘞爷,欢迎下次使用\n");
	//insert(head); 
	return 0;
} 
void function (struct Student *head,int flag)
{
    switch (flag)
	{
		case 1: insert(head);  //插入,删除,查询 每次只能操作一条数据 
		break;
		//case 2: dele(head);   //形参不能影响实参,所以要有一个返回值 
		//break;
		case 3: search(head);
		break;
		
	}	
} 

测试的数据

2011120010 刘** 3.0
2011120008 钦* 4.7
0 0 0
2011120002 徐** 4.8
2011120001 李** 4.7

当然也可以自己定,没关系

   

    其实都不想写的,上次1024水了篇实在不好意思,最近又在学这个结构体,指针就正好写一下。就像我开头写的那样这个程序有缺陷比如单次只能操作单挑数据,而且这个没有设计排序。

主要我也不会。后面有想法再加上去。

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页