定义单向链表输入学生信息



定义单向链表struct Node并实现:输入若干个学生信息(包括学号、姓名和成绩),输入学号为0时输入结束,再输入一个成绩值,将成绩小于该值的学生信息删除,并将成绩大于等于该值的学生信息输出。

输入输出示例:括号内为说明

输入样例:
1 zhang 78
2 wang 80
3 li 75
4 zhao 85
0
80
输出样例:
2 wang 80
4 zhao 85




#include<iostream>
#define ok 1
#define error 0

using namespace std;

typedef int status;

//定义一个student类型的结构体 
typedef struct 
{
	int sno;                  //学号 
	string sname;             //姓名 
	int grade;                //成绩 
}student;

typedef struct LNode 
{
	student data;             //学生类型的数据域 
	struct LNode *next;       //指针域 
} LNode, *LinkList;

//函数声明 
status InitList(LinkList &L);
status CreatList_R(LinkList &L);
status DispList(LinkList L);
status DeleteList(LinkList &L,int e);

int main() 
{
	LinkList L;
	InitList(L);
	
    CreatList_R(L);
  
    
	int flag;
	cin >> flag;
	
	LNode *d = L->next;                 //新结点d指向首元结点 
	while(d)
	{
		if(d->data.grade < flag)        //如果输入的成绩小于 flag 
		{
			int a = d->data.grade;      //把新结点的成绩存放在a中 
			d = d->next;                //结点d指向下一结点 
			DeleteList(L, a);           //删除L表中成绩为“a ”(a里面存放的是结点d的成绩信息)的结点 
		}
		else 
		    d = d->next;
	}
	DispList(L);                        //输出 
	return 0;
}

//初始化 
status InitList(LinkList &L) 
{
	L = new LNode;
	L->next = NULL;
	return ok;
}

//尾插法创建单链表
status CreatList_R(LinkList &L)
{   
    int e ;
	LNode *r = L;                       //尾指针指向头结点 

	while (1) 
	{
		cin >> e ;
		if (e != 0)                    //如果输入0,就终止循环 
		{
			LNode *p = new LNode;      //生成新结点 
			p->data.sno = e;           //将输入的学号信息存放在新结点的学号数据域中 
			cin >> p->data.sname ;     //输入学生姓名 
			cin >> p->data.grade ;     //成绩 
			r->next = p;               //尾指针指向新结点p(此时新结点成为新的尾指针) 
			p->next = NULL;            //新结点的next域置空 
			r = p;                     //尾指针指向新结点 
		}
		else
		   break;                       
	}
	return ok;
}

//删除 链表中成绩等于e的结点 
status DeleteList(LinkList &L,int e) 
{
	LNode *p = L->next;                  //P指向首元结点 
	LNode *q = L;                        //q初始化指向头结点 (其实也就相当于,p指向要删除的结点,q指向删除节点的前驱结点) 
	while(p->data.grade != e && p)       //如果成绩不等于e并且p不为空 
	{
		p = p->next;                     //p, q指向下一个结点 
		q = q->next;
	}
	if(p->data.grade == e)               //如果成绩等于e 
	{
		q->next = p->next;                //删除结点p 
		delete p;
		return ok;
	}
	else 
	    return error;
}

//输出 
status DispList(LinkList L) 
{
	LNode *p = L->next;                   //p指向首元结点 
	while(p)                              //p不为空就输出学生信息 
	{
		cout << p->data.sno << " " ;
		cout << p->data.sname <<" " ;
		cout << p->data.grade ;
		if (p->next != NULL)                
		    cout  << endl; 
	    p = p->next;                     //p不为空p就继续往“后”移动指向下一结点 
	}
	return ok;
}


版权声明:本文为qq_62175345原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。