从键盘输入一个链表(整数,输入-1截止),排序后以二进制方式保存到文件a.bf中,然后从文件从读出,输出到屏幕上。

//开始上面一节复制漏了,这是写了重新补上的,运行过没有错
#include<stdio.h>
#include<stdlib.h>

#define LEN sizeof(struct ZH)

struct ZH *Create()  ;
void Shu(struct ZH *head);
void Fang(struct ZH **head);
void Pai(struct ZH *head);

struct ZH
{
	int z;
	struct ZH *next;
};

int main()
{	
	struct ZH *head,*p;
	head=Create();
	Pai(head);
	Shu(head);
	FILE *fp;
	fp=fopen("a.bf","wb"); //要用rewind函数的话就把wb改成wb+
	if(fp==NULL)
	{
		printf("打开失败!!\n!!");
		exit(0);
	}
	p=head;
	while(p!=NULL)
	{
        fwrite(&p->z ,sizeof(int),1,fp);
		p=p->next ;
	}
//rewind(fp);   可以把我下面用双斜杠框起来的这一段替换成这一行函数,表示把文件位置指针重新指向了文件的开头位置,记得把上面打开文件那里的wb改成wb+
	fclose(fp);
	fp=fopen("a.bf","rb");
	if(fp==NULL)
	{
		printf("打开失败!!\n!!");
		exit(0);
	}
//
	int c;
	fread(&c,sizeof(int),1,fp);
	while(!feof(fp))
	{
		printf("%3d",c);
		fread(&c,sizeof(int),1,fp);
	}
	putchar('\n');
	fclose(fp);
	Fang(&head);
	return 0;
}
//链表创建
struct ZH *Create()   
{
	struct ZH *head=NULL,*p,*p1;
	p=(struct ZH*)malloc(LEN);
	scanf("%d",&p->z );
	p->next =NULL;
	while(p->z !=-1)
	{
		if(head==NULL)
		{
			head=p;
			p1=p;
		}
		else
		{
			p1->next =p;
			p1=p;
		}
		p=(struct ZH*)malloc(LEN);
	    scanf("%d",&p->z );
	    p->next =NULL;
	}
	p1->next =NULL;
	return head;
}
//输出链表
void Shu(struct ZH *head)
{
	struct ZH *p;
	p=head;
	while(p!=NULL)
	{
		printf("%3d",p->z );
		p=p->next ;
	}
	putchar('\n');
}
//释放链表
void Fang(struct ZH **head)
{
	struct ZH *p;
	while(*head!=NULL)
	{
		p=*head;
		*head=(*head)->next ;
		free(p);
	}
	*head=NULL;
}
//排序,这里我只是交换了结点的值,实在有点菜,本来想交换结点,有了想法,但是写出来一直没实现
void Pai(struct ZH *head)
{
	struct ZH *p;
	p=head;
	int sum=0,i=1,j=0;
	while(p!=NULL)
	{
		sum++;
		p=p->next ;
	}
	p=head;
	int temp;
	while(i<sum)
	{
		p=head;
		j=0;
		while(j<sum-i)
		{
			if(p->z>p->next ->z  )
			{
				temp=p->z ;
				p->z =p->next ->z ;
				p->next ->z =temp;
			}
			  p=p->next ;
			j++;
		}
		i++;
	}
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值