以一个%5d的格式存放20个整数的文件,顺序号定为0到19,输入某一顺序号之后,读出相应的数据并显示在屏幕上。
运用了链表,文件的操作,对于fprintf、fscanf、fseek函数的使用,虽然是一个很简单的任务,但让我对于这些知识点的运用和巩固做的很充分,调试了很久,收获颇丰!
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<assert.h>
#include<unistd.h>
int suiji()
{
return rand()%20;
}
typedef struct node
{
int num;
int data;
struct node *next;
}NODE;
NODE *createlist()
{
NODE *head = (NODE *)malloc(sizeof(NODE));
assert(head != NULL);
head->num = -9999;
head->data = -9999;
head->next = NULL;
return head;
}
void addlist(NODE *head, int num, int data)
{
NODE *p = head;
NODE *pnew = (NODE *)malloc(sizeof(NODE));
assert(pnew != NULL);
pnew->num = num;
pnew->data = data;
while(p->next != NULL)
{
p = p->next;
}
pnew->next = p->next;
p->next = pnew;
}
void writelist(NODE *head)
{
NODE *p = head->next;
FILE *fp = fopen("f4.dat", "w");
if(fp == NULL)
{
perror("open error");
}
while(p)
{
fprintf(fp, "%2d,%5d\n", p->num, p->data);
p = p->next;
}
fclose(fp);
}
void readlist(NODE *head1)
{
char ch;
NODE *p1 = head1->next;
NODE *pnew = (NODE *)malloc(sizeof(NODE));
FILE *fp = fopen("f4.dat", "r");
if(fp == NULL)
{
perror("open error");
}
while(1)
{
fscanf(fp, "%d,%d", &pnew->num, &pnew->data);
// sleep(1);
// printf("%d\n",pnew->num);
addlist(head1, pnew->num, pnew->data );
if(pnew->num == 19)
{
break;
}
fseek(fp, 1, SEEK_CUR);
}
fclose(fp);
}
int find(NODE *head, int number)
{
NODE *p = head->next;
while(p)
{
if(p->num == number)
{
printf("%d\n", p->data);
return 1;
}
p = p->next;
}
printf("输入序号不存在!\n");
return 0;
}
void printlist(NODE *head)
{
NODE *p = head->next;
while(p)
{
printf("%d:%d\n", p->num, p->data);
p = p->next;
}
}
int main()
{
int number;
srand(time(NULL));
NODE *head = createlist();
NODE *head1 = createlist();
for(int i = 0; i < 20; i++)
{
addlist(head, i, suiji());
}
printlist(head);
writelist(head);
readlist(head1);
// printlist(head1);
printf("请输入序号:\n");
scanf("%d", &number);
find(head1, number);
}