单链表的基本操作(以学生为例)


#include "stdio.h"
#include "string.h"
#define OK 1
#define ERROR 0

typedef struct student{     //定义学生结构体
  int num;              //学号
  char name[10];         //姓名
  float score;            //成绩
  char sex[2];            //性别
 }student;
 
typedef struct Node{          /* 定义单链表结点类型 */
    student data;            //数据域存放学生信息
    Node *next;
}Node,*LinkList;            //定义单链表指针

//2)输入下面的创建函数,也可自行设置。
/* 创建单链表*/
Node *creatList(LinkList L,int n)
{  	int i; Node *r,*p;
	L=new Node;	                    //申请新结点,作为表头
	L->next=NULL;
	r=L;
    for(i=1;i<=n; i++)
	{  	printf("i=%d\n",i);
        p=new Node;             	 //申请新结点,有数据的
	    printf("input node data:格式=学号 姓名 成绩 性别\n");
		 scanf("%d",&p->data.num);
		 scanf("%s",p->data.name);
		 scanf("%f",&p->data.score);
		 scanf("%s",p->data.sex);
		         
	    p->next = NULL;			     //新节点的指针置为空
    	r->next=p;
	    r=p;
	}
	printf("creatList函数执行,链表创建成功\n");
	return L;			//返回链表的头指针
}

//3)下面是输出函数,请补充填写完整
void output_L(LinkList L)
{
   LinkList p;
   p=L->next;
   printf("链表结点如下:\n");
   while(p!=NULL)                        
   {  printf("%d\t",p->data.num);
      printf("%s\t",p->data.name);
      printf("%.1f\t",p->data.score);
      printf("%s\t\n",p->data.sex);                       //输出学生的成绩和性别
	  p=p->next;
   }
   printf("\n");
}

//4) 下面是根据学号(int no)查找学生的函数,如果找到返回指向该学生的指针,否则返回NULL。请填空代码。
Node *LocateElem_L(LinkList L, int no) { 
	LinkList p;
	p = L->next;
	while (p&&p->data.num!=no)
		p = p->next; 
	return p;           //查找成功返回结点地址p,查找失败p为NULL 
}   
//5) 下面是插入函数,在i位置插入一个学生记录
 int List_insert(LinkList L,int i,student e)
{ Node *p=NULL,*q,*s; int j=1;
 if(i<1) { printf("出错!");return ERROR;}
 p=L;
 while(p&&(jnext; j++;   //移动到插入位置i
 }
 if(!p) { printf("出错!");return ERROR;}
  s=new Node;           	    //申请新节点,并接收学生记录各字段
  s->data.num =e.num;
  strcpy(s->data.name,e.name);
  s->data.score =e.score;                     //接收学生的姓名和成绩
  strcpy(s->data.sex,e.sex);
  s->next=p->next;
  p->next=s;
  return OK;
}

//6) 下面是删除第i个学生记录的函数,请补充完整。
int List_delete(LinkList L,int i)
{ LinkList p,q;
  int j=1;
  p=L;
  if(i<1) return ERROR;
  while((p)&&(jnext; j++; }
	    if(!p->next) return ERROR;
		q=p->next;
		p->next=q->next;
		delete q;
		return OK;  
}
//7) 编写计算所有学生的平均成绩的函数,下面是函数框架,也可自行编写。
float average_L(LinkList L)
{   LinkList p;  float avg, sum=0.0; int count=0;
   p=L->next;
   while(p!=NULL)        
   {  sum+=p->data.score; 
      count++;
      p=p->next;
   }
   avg=sum/count;
   return avg;
}
//8) 下面是main函数,请添加适当的语句,实现对学号为1004的学生的查找;并将学号为1003的学生成绩修改为100分。
int main()
{
    LinkList La,p,q; int no;student e;float avg,s;
	int n; int i,k;int max;
	printf("输入结点数n");
	scanf("%d",&n);
    La=creatList(La,n);
    output_L(La);
    printf("请输入查找的学号:\n");
    scanf("%d",&no);
    p=LocateElem_L(La,no);     
    if(p) printf("%d   %s   %0.1f   %s\n",p->data.num ,p->data.name,p->data.score,p->data.sex);  
    else
    printf("No found!\n");
    
	printf("请输入要修改成绩的学号和成绩:\n");
    scanf("%d%f",&no,&s);
    q=LocateElem_L(La, no);
    if(q)   q->data.score=s;
	else
	printf("No found!");
    output_L(La);                      //修改后的输出
    
	printf("插入的位置i和值e,i=?,e=?\n");
    scanf("%d",&i);
         scanf("%d",&e.num);
		 scanf("%s",e.name);
		 scanf("%f",&e.score);
	 	 scanf("%s",e.sex);
    
    List_insert(La,i,e);
output_L(La);                     //插入后的输出

    avg=average_L(La);                //求平均成绩avg
    printf("average=%0.1f\n",avg);
    
    printf("删除位置i=?\n");
    scanf("%d",&i);
    List_delete(La,i);
    output_L(La);                    //删除后的输出
    
   }

相关