链表之有头链表

//有头链表
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define N   sizeof(struct student)
 struct student
{	char name[20];
	int num;
	int score;

	struct student * next;

};
struct student * creat_list(int n);
void print_list(struct student* head);
void add_list(struct student* head);
void delete_list(struct student* head);
void sort_list(struct student* head);


int main (void)
{	struct student * Head;
	int n;
	scanf("%d",&n);	   //输入你需要创建链表的长度
	Head=creat_list(n);//返回头结点的地址	创建链表
	print_list(Head);  //发送头节点的地址   输出链表
	add_list(Head);   //发送头节点的地址   插入
	delete_list(Head); //发送头节点的地址	删除
	sort_list(Head);  //发送头节点的地址	链表排序(这里是升序)
	print_list(Head);  //发送头节点的地址	再次输出

	return 0;
}
struct student * creat_list(int n)
{	int i=1;
	struct student *head,*p0,*p1;
	head=p0=(struct student* )malloc(N);//动态创建一块内存记为头结点
	p1=(struct student* )malloc(N);//动态创建一块内存记为首结点;
	scanf("%d %s %d",&p1->num,p1->name,&p1->score);
	while(i<n)
	{	p0->next=NULL;
		p1->next=p0->next;
		p0->next=p1;
		p0=p1;
		p1=(struct student * )malloc(N);
		scanf("%d %s %d",&p1->num,p1->name,&p1->score);
		i++;
	}
	p0->next=p1;
	p1->next=NULL;
	return head;

}
void print_list(struct student* head)
{
	struct student *p0;
	p0=head->next;
	while(p0!=NULL)
	{	printf("%s %d %d\n",p0->name,p0->num,p0->score);
		p0=p0->next;
	}
}
void add_list(struct student* head)
{
	struct student*p0,*p1=head;
	p0=(struct student* )malloc(N);
	scanf("%d %s %d",&p0->num,p0->name,&p0->score);
	head=head->next;
	while(head!=NULL)
	{
		if(head->num>p0->num)//插在链表的头结点后边或中间
		{		p0->next=p1->next;
				p1->next=p0;
				break;
		}
		p1=head;
		head=head->next;
	}
	if(head==NULL)//插在链表的最后
	{	head->next=p0;
		p0->next=NULL;
	}

}
void delete_list(struct student* head)
{	struct student *p1=head;
	int num;
	scanf("%d",&num);
	head=head->next;
	while(head!=NULL)
	{
		if(head->num==num)
		{
			p1->next=head->next;
			free(head);
			break;
		}

		p1=head;
		head=head->next;
	}
	if(head==NULL)
	{
		p1->next=NULL;
		free(head);
	}
	
}
void sort_list(struct student* head)
{
	struct student *p0,*p1,*p2;
	char a[10];
	int m,n;
	for(p0=head->next;p0!=NULL;p0=p0->next)
	{	p2=p0;
		for(p1=p0->next;p1!=NULL;p1=p1->next)
		{
			if(p2->num>p1->num)//升序排序
			{
				p2=p1;			
			}
		}
		if(p2!=p0)
		{	m=p0->num;
			p0->num=p2->num;
			p2->num=m;
			strcpy(a,p0->name);
			strcpy(p0->name,p2->name);
			strcpy(p2->name,a);
			n=p0->score;
			p0->score=p2->score;
			p2->score=n;
		}
	}
	
}

猜你喜欢

转载自blog.csdn.net/L_Z_jay/article/details/103751787