Ⅰ 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)
调用方式和函数内部返回值都需要相应改动。