结构体和链表整理(头插法和尾插法)

1.0尾插法

#include<stdio.h>
#include<stdlib.h>
struct Student
{
	int num;
	float score;
	struct Student* next;
};
int n;
struct Student *create(void)
{
	struct Student* head;
	struct Student* p1, * p2;
	n = 0;
	p1 = p2 = (struct Student*)malloc(sizeof(struct Student));
	scanf("%d,%f", &p1->num, &p1->score);
	head = NULL;
	while (p1->num != 0)
	{
		n += 1;
		if (n == 1)
		{
			head = p1;
		}
		else p2->next = p1;
		p2 = p1;
		p1 = (struct Student*)malloc(sizeof(struct Student));
		scanf("%d,%f", &p1->num, &p1->score);
	}
	p2->next = NULL;
	return(head);
}
void print(struct Student *head)
{
	struct Student* p;
	printf("have %d records\n", n);
	p = head;
	if (head!=NULL)
	{
		do
			{
				printf("%d,%5.1f\n", p->num, p->score);
				p = p->next;
			} while(p!=NULL);
	}
}
int main()
{
	struct Student* pt;
		pt = create();
		print(pt);
		return 0;
}

2.0头插法

#include<stdio.h>
#include<stdlib.h>
struct Book
{
	char title[100];
	char anthor[100];
	struct Book* next;
};
void input(struct Book* book)
{
	printf("title:");
	scanf("%s", book->title);
	printf("anthor:");
	scanf("%s", book->anthor);
}
void addbook(struct Book** head)
{
	struct Book* book,*temp;
	book = (struct Book *)malloc(sizeof(struct Book));
	if (book == NULL)
	{
		printf("defeat");
		exit(1);
	}
	input(book);
	if (*head != NULL)
	{
		temp = *head;
		*head = book;
		book->next = temp;
	}
	else
	{
		*head=book;
		book->next = NULL;
	}
}
void print(struct Book* head)
{
	struct Book* book;
	int count = 1;
	book = head;
	while (book != NULL)
	{
		printf("NO. %d\n", count);
		printf("title:%s ", book->title);
		printf("anthor:%s \n", book->anthor);
		book = book->next;
		count++;
	}
}
void re(struct Book* head)
{
	while (head != NULL)
	{
		head = head->next;
		free(head);
	}
}
int main()
{
	struct Book* head=NULL;
	int ch;
	while (1)
	{printf("是否需添加");
		do {
			
			ch = getchar();

		} while (ch != 'y' && ch != 'n');

		if (ch == 'y')
		{
			addbook(&head);
		}
		else
			break;
	}
		printf("是否需打印");
	do {
	
		ch = getchar();

	} while (ch != 'y' && ch != 'n');
	if (ch == 'y')
	{
			print(head);	
	}	
	re(head);
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值