Ⅰ c語言 如何將文件里數據讀入鏈表中,在下次用時自動導入數據
給你優化了一下,你試試,有問題再聯系
#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct Stu)
struct Stu *inlist();
void save(struct Stu *head);
struct Stu *add(struct Stu *head);
void insertNode(struct Stu *head,struct Stu *newNode);
struct Stu *read();
void print(struct Stu *head);
typedef struct Stu{
char name[20];
char sex[10];
char dep[20];
int number;
struct Stu *next;
}sqlist;
sqlist *inlist()/*數據的輸入*/
{
sqlist *p,*q;
sqlist *head;
int n=0;
printf("請輸入名字 性別 部門 學號:\n");
p=q=(sqlist*)malloc(LEN);
scanf("%s%s%s%d",p->name,p->sex,p->dep,&p->number);
head=NULL;
while(p->number!=0)
{n=n+1;
if(n==1)
head=p;
else
q->next=p;
q=p;
p=(sqlist*)malloc(LEN);
scanf("%s%s%s%d",p->name,p->sex,p->dep,&p->number);
}
q->next=NULL;
return head;
}
void save(sqlist *head)
{
sqlist *p;
FILE *f;
p=head;
if(p!=NULL)
{
f=fopen("amd.txt","w+");
do
{
/*
char name[20];
char sex[10];
char dep[20];
int number;
fprintf(f,"%5s%5s%5s%5d\n",&p->name,&p->sex,&p->dep,&p->number);
printf("%5s%5s%5s%5d\n",p->name,p->sex,p->dep,p->number);
數據如果超過5的長度,讀的時候就不能正確取出來了,因此,應該按數據定義的長度來記錄數據
+1是為了讀取時方便,左對齊右補空格
**/
fprintf(f,"%-21.21s%-11.11s%-21.21s%-11d\n",p->name,p->sex,p->dep,p->number);
p=p->next;
}
while(p!=NULL);
fclose(f); //fclose要和fopen相呼應
}
//close(f);
}
sqlist *add(sqlist *head)
{
sqlist *p,*New;
//sqlist *q;
p=head;
while(p->next!=NULL)
{
p=p->next;
}
printf("請輸入名字 性別 部門 學號:\n");
New=(sqlist*)malloc(LEN);
scanf("%s%s%s%d",New->name,New->sex,New->dep,&New->number);
New->next=p->next;
p->next=New;
if(New->next==NULL)
{
return head;
}
else
printf("wait");
return head;
}
sqlist *read()
{
FILE *fp;
sqlist *f,*head=NULL; //指針要習慣給它賦初值NULL,不要形成野指針
char str[128];
if((fp=fopen("amd.txt","r+"))==NULL)
{
printf("打開文件失敗!!\n");
return head; //此時head is NULL
}
if( fgets( str , sizeof(str) , fp ) == NULL )
{
printf("文件中沒有數據!\n");
fclose(fp);
return head; //此時head is NULL
}
//有數據再創建鏈表,不要創建空表
head=(sqlist*)malloc(LEN);
if(head==NULL)
{
printf("分配內存失敗!\n");
fclose(fp);
exit(0);
}
head->next=NULL;
sscanf(str,"%s %s %s %d",head->name,head->sex,head->dep,&head->number) ;
while (fgets( str , sizeof(str) , fp ) != NULL)
{
f=(sqlist*)malloc(LEN);
f->next=NULL;
sscanf(str,"%s %s %s %d",f->name,f->sex,f->dep,&f->number) ;
insertNode(head,f);
}
fclose(fp);
return head;
}
void insertNode(sqlist *head,sqlist *newNode)
{
sqlist *f;
f=head;
while(f->next!=NULL)
{
f=f->next;
}
f->next=newNode;
newNode->next=NULL;
}
void print(sqlist *head)
{
sqlist *f;
f=head;
if(f!=NULL)
{
do
{
printf("%-21s%-11s%-21s%-11d\n",f->name,f->sex,f->dep,f->number);
f=f->next;
}while(f!=NULL);
}
}
int main()
{
sqlist *head;
head=read();
if ( head == NULL )
{
head=inlist();
save(head);
}
else
print(head);
head=add(head);
save(head);
print(head);
return 0;
}
Ⅱ c語言如何從文件讀入,並存放在鏈表中
//舉個單鏈表的例子,首先定義鏈表成員的結構體
struct filetext{char buf[BUFSIZE];
struct filetext *next;};
//讀取文件,並插入進鏈表的函數,filename為要讀取的文件名,head為鏈表的頭節點,函數返回插入新節點後鏈表的頭節點
struct filetext * readfile(char * filename,struct filetext * head)
{struct filetext * new = (struct filetext *)malloc(sizeof(struct filetext));//定義一個新成員,並給它分配空間
FILE * fp;//讀取文件的文件流
struct filetext * p =head;//定義一個p,用來尋找鏈表中最後一個節點
if((fp=(fopen(filename,"r+")))==NULL)
{//如果打開文件失敗,返回head,並提示
printf("open file failure");
return head;}
//然後開始讀取文件,放到new的buf中
if(fread(new->buf,BUFSIZE,1,fp)<1)
{//如果讀取失敗,提示,並返回head
printf("read file failure");
return head;}
fclose(fp);
//文件讀取完後,進行鏈表操作
if(!head)//如果傳進來的head是個空指針,那麼新指針就作為頭節點返回
{new->next = NULL;
return new;}
while(p->next) p = p->next;//把p移動到最後一個節點
p->next = new;//p的下一個節點為new
new->next = NULL;//new的下一個節點為空
return head;
//這樣這個函數就完成了,你可以寫個主函數,定義一個頭節點,試下。
(2)c語言怎麼錄入數據鏈表擴展閱讀:
線性表的鏈式存儲表示的特點是用一組任意的存儲單元存儲線性表的數據元素(這組存儲單元可以是連續的,也可以是不連續的)。
因此,為了表示每個數據元素與其直接後繼數據元素 之間的邏輯關系,對數據元素 來說,除了存儲其本身的信息之外,還需存儲一個指示其直接後繼的信息(即直接後繼的存儲位置)。由這兩部分信息組成一個"結點"(如概述旁的圖所示),表示線性表中一個數據元素。
線性表的鏈式存儲表示,有一個缺點就是要找一個數,必須要從頭開始找起,十分麻煩。根據情況,也可以自己設計鏈表的其它擴展。但是一般不會在邊上附加數據,因為鏈表的點和邊基本上是一一對應的(除了第一個或者最後一個節點,但是也不會產生特殊情況)。
不過有一個特例是如果鏈表支持在鏈表的一段中把前和後指針反向,反向標記加在邊上可能會更方便。
Ⅲ C語言 怎麼把結構體數組寫入鏈表
1.用頭插法。因為數據追加和刪除比較多,追加的話,頭插法可以直接插,用尾插降低了時間效率,刪除用兩個一樣。
2./*結構體定義*/
struct client{
char account[14];
char name[10];
char identity[20];
char address[15];
long int money;
};
/*鏈表結點定義*/
struct node{
struct client band_inf;
struct node *next;
};
應該把結構體結點定義成鏈表的成員,這樣鏈表才對。如果像你那樣定義的話,完全不用定義結構體,鏈表就搞定了。因為你在鏈表裡面把結構的成員都又定義了。
3.
1),定義結點:p1=(struct node*)malloc(sizeof(struct node)) ;表示定義一個node型的結點指針
使用,這個要看具體怎麼用了。比如說刪除searchp,priorp是searchp的前面一個結點,這樣寫
priorp->next=searchp->next;
delete searchp; 即可
插入newnode在searchp的後面,可以這樣:
newnode->next=searchp->next;
Ⅳ C語言中將鍵盤輸入的信息存入鏈表
#include <stdio.h>
#include <stdlib.h>
#define M 2
int n,i,j,x; //定義變數 ,M為行,n為列,i、j為循環變數,x為自變數
typedef struct Node //建立線性鏈表
{
int a[M][1];//定義一個列數組
struct Node*next;//指針成員
}LNode;
void create(LNode*head);//創建線性鏈表函數聲明
void display(LNode*head);//顯示線性鏈表函數聲明
void Deleteline(LNode*head);//刪除鏈表中的某幾列函數聲明
void Change(LNode*head);//改變鏈表中數據的函數的聲明
int main(int argc, char *argv[])
{
printf("列表目前行數等於2\n");
printf("目前列數等於0\n");//表示 m行0列
LNode*head;//定義鏈表頭指針
head=(LNode*)malloc(sizeof(LNode));//分配空間
head->next=NULL;//下一個為空
create(head);//建立線性鏈表
display(head);//顯示線性鏈表
Deleteline(head);//刪除某一列
display(head);//顯示
Change(head);//改變元素
system("PAUSE");
return 0;
}
void create(LNode*head)
{
LNode*p,*rear=head;//空的線性鏈表頭和尾
printf("輸入 '0'或'1'\n如果您輸入 '0',則結束輸入:");
scanf("%d",&x);
n=0;//表示有0列
while(x)//輸入"0"則退出
{ if(!n)
printf("輸入第一列:\n");
else printf("輸入下一列:\n");
p=(LNode*)malloc(sizeof(LNode));//為指針分配空間
for(i=0;i<M;i++)//循環輸入該列的每一行每一個元素
{ scanf("%d",&x);
p->a[i][0]=x;
}
p->next=NULL;//新追加的結點為尾結點,後繼為空
rear->next=p;//新追加的結點在最後,也就是rear的後繼
rear=p;//新追加的結點為新的表尾,rear指向新的表尾
printf("輸入 '0'或'1'\n如果您輸入 '0',則結束輸入:");
scanf("%d",&x);
n++;//列數自增一
}
}
void display(LNode*head)//列表顯示函數
{
LNode*p=head->next;//定義指針成員指向表頭
printf("列表\n");//顯示列表名稱並換行
for(j=0;j<M;j++)
{
for(i=0;i<n;i++)//執行 「行循環 」
{
printf("%d\t",p->a[j][0]); //
p=p->next;//p指向下一元素
}
p=head->next;//重新指到表頭
printf("\n");//換行
}
printf("n=%d\n",n);
}
void Deleteline(LNode*head)
{
LNode*p=head->next;//定義成員指針
int k;//定義所刪除的列序號
printf("輸入您要刪除的列序號:");//提示輸入列序號
scanf("%d",&k);//接收列序號
if(k==1)
{
head->next=p->next;//將頭指針的後繼變為第二列
free(p);//釋放空間
n--;//n自減
printf("n=%d\n",n);
}
else if(k<n)
{
for(i=2;i<k;i++)//循環找到節點的前驅
{
p=p->next;
}
LNode*q=p->next;//定義指向所刪除列的指針
p->next=q->next;//把所刪除的列節點的後繼賦給其前驅的後繼
free(q);//釋放空間
n--;
printf("n=%d\n",n);
}
else
{
for(i=1;i<k;i++)//直接找到
{
p=p->next;
}
free(p);//釋放
n--;
printf("n=%d\n",n);
}
}
void Change(LNode*head)
{
int k;//定義所要改變的元素的列數
LNode*p=head->next;//定義指向第一個元素的結構指針
printf("輸入您要改變的元素的行坐標:");//提示輸入要改變的元素的行坐標
scanf("%d",&j);//接收
printf("輸入您要改變的元素的列坐標:");//提示輸入要改變的元素的列坐標
scanf("%d",&k);//接收
for(i=1;i<k;i++)//找到
{
p=p->next;
}
printf("請輸入改變後的值:");//提示輸入改變的值
scanf("%d",&x);//接收
p->a[j-1][0]=x;//傳值
display(head);//再現
}
我這是一個鏈表構造的列表,功能有:建立一個列表、刪除一列,顯示列表、改變具體位置的元素值四個大功能。不過行數初始化確定了的,是2,你也可以自己設計如何在dos窗口動態輸入。注釋都有,你自己還可以修改其中的函數和語句,使這個結構功能變得更強大。
希望對你有所幫助!!!
Ⅳ 如何用c語言將文件中的數據寫入鏈表中
sw是我鏈表的首地址
fp是文件的指針
下面定義鏈表類型:num域存放的是int型數據,可根據你的情況來改變。
typedef
struct
node{
int
num;
struct
node
*next;
}node;
p
指向鏈表中的首元結點
while(p!=null){
fprintf(fp,
"%d,%s",
p->num);
p=p->next;
}
其實,這樣操作是非常簡單的。
Ⅵ C語言鏈表的輸入
#include "stdio.h"
#include "malloc.h"
#define NULL 0
#define LEN sizeof(struct student)
struct student
{
long num;
float score;
struct student *next;
};
int n;
struct student *creat(void)
{
struct student *p1,*p2,*head;
n=0;
p1=(struct student*) malloc(LEN);
p2=p1;
scanf("%ld,%f",&p1->num,&p1->score);
head=NULL;
while(p1->num!=0)
{
n=n+1;
if(n==1)
head=p2;
else
p2=p1;//這里是把p1的地址賦值給p2
p1=(struct student*) malloc(LEN);
p2->next = p1;
scanf("%ld,%f",&p1->num,&p1->score);
}
p2->next=NULL;
return(head);
}
int main(void)
{
struct student *head_link;
printf("please input records, as 2007,100:\n");
head_link=creat();
while(head_link != NULL)
{
printf("%ld,%f\n",head_link->num,head_link->score);
head_link = head_link->next;
}
return 0;
}
這個應該就可以用了,你的裡面除了一些像print等語法錯誤之外
最主要的是錯誤是在creat函數對鏈表中元素(現在採用了指針,對p1與p2)的處理不當
首先你使用head保存鏈表中第一個元素也就是第一個節點的首地址
然後依靠p1和p2繼續分配地址,p1分配地址並獲取數據,通過while中的條件,如果不是終止標識就存儲進鏈表中(通過p2->next,所以嚴格意義上來講,p1就是單純的指針,我們並沒有把它鏈進鏈表中去,只有p2是用來鏈進鏈表中的),所以你的主要失誤是p1=p2->next處理的不對
呵呵,我自己也不怎麼會,要是說的不對的地方,還請諒解
Ⅶ C語言鏈表的建立與插入
#include
<stdio.h>
#include
<stdlib.h>
//使用結構體構建鏈表
struct
node{
int
data;
struct
node
*next;
};
void
main()
{
int
a,n=1;
struct
node
*p,*head,*t;
head=(struct
node
*)malloc(sizeof(struct
node));
//p=(struct
node
*)malloc(sizeof(struct
node));
//申請動態空間
p=head;
//申請動態空間
t=(struct
node
*)malloc(sizeof(struct
node));
for(;n<=5;n++)
//輸入1,3,5,7,9
{
p->data=2*n-1;
p->next=(struct
node
*)malloc(sizeof(struct
node));
p=p->next;
}
printf("原始鏈表如下:\n");
//輸出原始鏈表
for(p=head;p->next!=NULL;p=p->next)
{
printf("%d
",p->data);
}
printf("\n請輸入需要插入的數據\n");
//輸入所要插入的新數據
scanf("%d",&a
);
for(p=head;p->next!=NULL;)
//按順序插入相應位置
{
if(p->data
<=
a
&&
(p->next)->data
>=
a)
{
t->data
=a;
t->next
=p->next
;
p->next=t;
break;
}
p=p->next
;
}
printf("插入新數據後的鏈表\n");
//輸出插入新數據的鏈表
for(p=head;p->next!=NULL;)
{
printf("%d
",p->data);
p=p->next;
}
printf("\n");
free(p);
free(head);
free(t);
}
Ⅷ c語言如何將文件數據讀入鏈表用fread
gsl-1.16\cblas.libs 目錄中可以找到如下文件:
libgslcblas.a
libgslcblas.dll.a
libgslcblas-0.dll
Ⅸ C語言把文件中的數據導入到單鏈表中。
這樣當然是不行的,最明顯的錯誤就是你的malloc函數沒有放在while循環之中,也就是說你只申請了一個textbook空間,當然不對啦
大概應該是這樣吧
while(!feof(fp)){
//head->next = malloc
//fread(head->next)
//head = head->next
}
head->next = NULL;
沒驗證,有問題再說
Ⅹ 用c語言創建鏈表
void CreateList_H(Linklist L,int n)中的L是局部變數,你生成的頭結點L不能被返回,應該改為:
Linklist CreateList_H(int n)
調用方式和函數內部返回值都需要相應改動。