C语言——实现用链表存储学生信息,当输入0退出输入,并查找学号为3的学生是否存在

功能实现:

1、往链表内录入学生的学号信息;

2、当输入的学号为0时候,退出录入;

3、查找链表内是否有学号为3的学生。

编译执行结果:

C语言——实现用链表存储学生信息,当输入0退出输入,并查找学号为3的学生是否存在_第1张图片

代码实现:

#include 
#include 

#define LEN sizeof(struct student)

struct student
{
	int num; //学号
	struct student *next;//指向下一个节点的指针
};
int n ; //节点的总数
/*功能:创建链表
 * 返回:指向链表表头的指针*/
struct student *Create()
{
	struct student *head;		//头节点
	struct student *p1 = NULL;	//p1保存创建的新节点的地址
	struct student *p2 = NULL;	//P2保存原链表最后一个节点的地址
	
	n = 0;	//创建前链表的节点总数为0,空链表
	p1 = (struct student *)malloc(LEN);	//开辟一个新节点
	p2 = p1;		//如果节点开辟成功,则将p2先把它的指针保存下来以备后用
	if(p1 == NULL)	
	{
		printf("Cann`t create it, try it again in a moment\n");
		return NULL;
	}else{
		head = NULL;	//开始head指向null
		printf("Please input %d node -- num:",n+1);
		scanf("%d",&(p1->num)); //录入数据
	}
	while(p1->num != 0)  //只要学号不为0 就继续录入下一个
	{
		n += 1;
		if(n == 1)//如果节点总数是1, 则head指向刚创建的节点p1
		{
			head = p1;
			p2->next = NULL;	//此时的p2就是p1,也就是p1->next指向NULL。
		}else{
			p2->next = p1;		//指向上次下面刚开辟的新节点
		}
		p2 = p1;		//把p1的地址给p2保留,然后p1产生新的节点
		p1 = (struct student *)malloc(LEN);
		printf("Please input %d node -- num:",n+1);
		scanf("%d",&(p1->num)); //录入数据
	}
	p2->next = NULL;	//此句就是根据单向链表的最后一个节点要指向null
	free(p1);	//p1->num为0的时候跳出了while循环,并释放p1
	p1 = NULL;	//释放的变量 清空为null
	return head;  //返回创建链表的头指针
}

/* 功能:输出节点
 * 返回:void
 * */
void Print(struct student *head)
{
	struct student *p;
	printf("Now,These %d records are:\n",n);
	p = head;	
	if(head != NULL)	//只要不是空链表,就输出链表中所有节点
	{
		printf("head is %o\n",head); //输出头指针指向的地址
	}
	do{
		printf("%o %d %o\n",p, p->num, p->next);
		p = p->next;
	}while(p != NULL);
}

int find(struct student *head, int i)
{
	struct student *p;
	p = head->next;
	while(p)
	{
		if(p->num == i)
			return 1;
		p = p->next;
	}
	return 0;
}
	
int main()
{
	struct student *head;
	struct student *stu;
	int thenumber;	
	head = Create();
	Print(head);

	if(find(head, 3) == 1)
		printf("have\n");
	else
		printf("no have\n");
		
	return 0;
}

 

你可能感兴趣的:(C,语言,对字符串的操作)