单链表的基本操作 创建 插入 删除 输出 (不带头节点版)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define len sizeof(struct Student)
typedef struct Student
{
	char a[20];
	int score;
	struct Student * next;
}Fun;
int  n = 0;

Fun* creat()//创建链表 输入
{
	Fun *head = NULL;
	Fun *p1, *p2;
	p1 = p2 = (Fun*)malloc(len);
	scanf("%s", &p1->a);
	while (strcmp(p1->a, "#") != 0)
	{
		n++;
		scanf("%d", &p1->score);
		if (n == 1) head = p1;
		else p2->next = p1;
		p2 = p1;
		p1 = (Fun*)malloc(len);
		scanf("%s", &p1->a);
	}
	p2->next = NULL;
	return (head);
}

void print(Fun *head)//输出
{
	Fun *p;
	for (p = head; p != NULL; p = p->next)
		printf("%s %d\n", p->a, p->score);
}

Fun * insert(Fun *head, Fun *stud)//插入
{
	Fun *p0, *p1, *p2=NULL;
	p1 = head;
	p0 = stud;
	if (head == NULL)
	{
		head = p0; p0->next = NULL;
	}
	else
	{
		while ((p0->score <=p1->score) && (p1->next != NULL))
		{
			p2 = p1;
			p1 = p1->next;
		}
		if (p0->score > p1->score)
		{
			if (head == p1) head = p0;
			else
				p2->next = p0;
				p0->next = p1;
		}
		else
		{
			p1->next = p0;
			p0->next = NULL;
		}
		n++;
		return head;
	}
}
Fun *del(Fun *head, Fun * num)//删除
{
	Fun *p1,*p2=NULL;
	p1 = head;
	while (strcmp(p1->a, num->a) != 0&&p1->next!=NULL)
	{
		p2 = p1; p1 = p1->next;
	}
	if (strcmp(p1->a, num->a) == 0)
	{
		if (p1 == head) head = p1->next;
		else p2->next = p1->next;
	}
	return head;
}
int main()
{
	Fun *head, *stu,*num;
	head = creat();
	stu = (Fun*)malloc(len);
	scanf("%s", &stu->a);
	while (strcmp(stu->a, "#") != 0)
	{
		scanf("%d", &stu->score);
		head = insert(head, stu);
		stu = (Fun*)malloc(len);
		scanf("%s", &stu->a);
	}
	num = (Fun*)malloc(len);
	scanf("%s", &num->a);
	while (strcmp(num->a, "#") != 0)
	{
		head = del(head, num);
		num = (Fun*)malloc(len);
		scanf("%s", &num->a);
	}
	print(head);
}

猜你喜欢

转载自blog.csdn.net/youtiankeng/article/details/87816058
今日推荐