实验五 结构体程序设计(四)

一、实验目的及要求

  1. 进一步理解结构体的概念;
  2. 掌握结构体的定义和结构体变量的定义和使用方法;
  3. 能正确使用结构体数组;
  4. 掌握链表的基本概念,能够编写简单的应用程序
  5. 进一步提高编程能力。

1.一个班有10名同学,每名同学都有如下信息:学号,姓名,三门课程的成绩。请编写程序输入全班同学的信息,并且按第一门课程的成绩从小到大排序后输出。

5.按照输入的顺序建立一个链表,每个节点包括:学号、姓名、性别、年龄。直到输入的学号为-1结束。然后输出此链表。然后从键盘上输入一个学生的学号,把此学生的节点删除后再输出链表。(要求建立链表、删除用函数)

6.修改5题的建立链表的函数,要求按照输入的逆序建立链表。其他不变。

//  filename: 建立一个链表,每个节点包括:学号,姓名,性别以及年龄, 
//  输入一个链表,如果链表中的节点所包含的年龄等于此年龄,	 
 //则将此节点删去 
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
	
typedef struct students{    
	int num;//学号    
	char names[30];//名字    
	char sex[10];//性别    
	int age;    
	struct students* next;    
}data;

//创建链表
data* setList()
{  
	data *head = (data *)malloc(sizeof(data));    
	head->next = NULL;    
	data* cur=NULL;   
	data *pt = head;
	data students;    

	int i=1;    
	printf("第%d个学生信息:",i++);    
	scanf("%d %s %s %d", &students.num, students.names, students.sex, &students.age); //输入数据
 
  	while (students.num !=-1 ) 
  	{      
  		cur = (data *)malloc(sizeof(data));
        	cur->num = students.num;       
        	strcpy(cur->names,students.names);        
        	strcpy(cur->sex,students.sex);        
        	cur->age=students.age;
        	cur->next = NULL;        
        	pt->next = cur;       
        	pt = cur;        
        	printf("第%d个学生信息:",i++);        
        	scanf("%d %s %s %d", &students.num, students.names, students.sex, &students.age); //输入数据   
  	}
  		
    	return head;
}
//输出链表
void show_List(data* headp)
{    
	data* headpp=headp->next;
	
    	while (headpp != NULL) 
    	{        
    		printf("学号 %d 名字 %s 性别 %s 年龄 %d\n",headpp->num,headpp->names,headpp->sex,headpp->age);
    		headpp=headpp->next;
   	}
}

//删除链表
void deleteList(data* head,int age)
{    
	data* posNode=head->next;    
	data* posNodeFront=head;
	
    	if (posNode==NULL)    
    	{        
    		printf("链表为空");
   	}else
   	{ 
   	     while (posNode->age != age) 
   	     {            
   		posNodeFront=posNode;
   		posNode=posNodeFront->next; 
   		if (posNode== NULL)
   		{             
   			printf("没有找到相关信息,无法删除\n");
   			return;            
   		}
   		           
   	     }         
   	     posNodeFront->next=posNode->next;
   	     free(posNode);    
       } 
}
//链表逆序
void reverse(data *head)
{    
	data *p = head->next;
	data *q = head->next->next;    
	data *t = NULL;
        while (q != NULL)    
        {        
        	t = q->next;        
        	q->next = p;       
        	p = q;        
        	q = t;    
        }    
        q = NULL;    
        head->next->next = NULL;    
        head->next = p;
}
int main(int argc, char const *argv[]){

    //头节点    
    data* headnode=(data*)malloc(sizeof(data));
    
    //创建链表            
    headnode=setList();            
    show_List(headnode);
    
    //删除链表            
    int age;            
    printf("请输入一个年龄:");            
    scanf("%d",&age);            
    deleteList(headnode,age);            
    printf("进行了删除链表数据的操作之后的数据:\n");            
    show_List(headnode);
    
    //链表逆序
    printf("以下是逆序后的数据:");           
    reverse(headnode);            
    show_List(headnode);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值