C言語はファイルから情報を導入してリンクを作成します.
31129 ワード
ファイルからデータを導入してチェーンを作って、学生の情報の増加を実現して、削除して、調べて、機能のチェーンの創立を取って頭と尾に分けて挿し込んで、頭はデータの読み取りの順序と挿入の順序が相反します.補間読取順序は挿入順序と同じです.具体的なコードは以下の通りです.
#include
#include
#include
#include
#include
#define OK 1
#define ERROR 0
typedef struct {
char name[8];
int id;
int score;
} student;
typedef struct LNode {
student date ;
struct LNode *next;
} LNode, *Linklist;
チェーンブロックを初期化する
int Openfile ( Linklist L )
{
char n[8];
int t, s;
Linklist p, newn;
p = L; /* */
FILE *r;
if ( ( r = fopen ("as.txt", "r" ) ) == NULL ) {
printf("can't open the file!!!
");
printf("error:%s
", strerror(errno));
exit(0);
}
while ( fscanf ( r, "%s%d%d", n, &t, &s ) != EOF ) {
newn = ( LNode * ) malloc ( sizeof ( LNode ) );
strcpy ( newn -> date.name, n );/* strcpy()*/
newn -> date.id = t;
newn -> date.score = s;
newn->next=NULL; /* */
p->next=newn; /* ( ) */
p=newn; /* */
}
fclose(r);
}
印刷
void PrintList (Linklist L) {
Linklist p;
p=L;
printf(" \t\t\t\t \t\t\t\t
");
while ( p->next )/* p , */
{
printf("%s\t\t\t\t%d\t\t\t\t%d
",p->next->date.name,p->next->date.id,p->next->date.score);
p = p -> next;
}
printf("
");
}
挿入を削除
int ListDelete ( Linklist L ) {
int i, j = 0;
Linklist p, r;
p = L;
printf("
");
scanf("%d", &i);
while (p->next!=NULL&&j<i-1)
{
p = p->next;
j++;
}
if ((j!=i-1)||(p->next==NULL)){
printf("
");
return ERROR;
}
r = p->next;
p->next=r->next;
free(r);
return OK;
}
int ListInsert(Linklist L )
{
Linklist p,newn;
int k,j=0;
student s;
p=L;
printf("
");
scanf("%d",&k);
while(p!=NULL&&j<k-1)
{
p=p->next;
j++;
}
if((j!=k-1)||(p==NULL))
{
printf(" ");
return ERROR;
}
printf("================ ==============
");
printf("***** :"); scanf("%s",s.name);
printf("***** :"); scanf("%d",&s.id);
printf("***** :"); scanf("%d",&s.score);
printf("
");
newn=(LNode*)malloc(sizeof(LNode));
newn->date= s ;
newn->next=p->next;
p->next=newn;
return OK;
}
調べ取る
int Locate(Linklist L){
int s;
printf("
");/* error: stray '\243' in program| */
scanf("%d",&s); /* */
Linklist p;
p=L->next;
while(p)
{
if(p->date.id==s)
printf(" :%d
",p->date.score);
p=p->next;
}
return ERROR;
}
int GetElement(Linklist L){
int i,j=1;
Linklist p;
p=L->next;
printf("
");
scanf("%d",&i);
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p||j>i) return ERROR;
printf("
");
printf("***** :%s
",p->date.name);
printf("***** :%d
",p->date.id); /*printf */
printf("***** :%d
",p->date.score);
return OK;
}
メイン関数
void main()
{
Linklist L;
L = ( Linklist ) malloc ( sizeof ( Linklist ) );
L -> next = NULL;
Openfile(L);
PrintList(L);
ListInsert(L);
PrintList(L);
ListDelete(L);
PrintList(L);
Locate(L);
GetElement(L);
}
前挿法でチェーンブロックを作成する部分コードは以下の通りです.int Openfile ( Linklist L )
{
char n[8];
int t, s;
Linklist p, newn;
p = L;
FILE *r;
if ( ( r = fopen ("as.txt", "r" ) ) == NULL )
{
printf("can't open the file!!!
");
printf("error:%s
", strerror(errno));
exit(0);
}
while ( fscanf ( r, "%s%d%d", n, &t, &s ) != EOF )
{
newn = ( LNode * ) malloc ( sizeof ( LNode ) );
strcpy ( newn -> date.name, n );
newn -> date.id = t;
newn -> date.score = s;
newn -> next = p -> next;
p -> next = newn;
}
fclose(r);
}