C语言中将键盘输入的信息存入链表

供稿:hz-xin.com     日期:2025-01-13
C语言怎么从文件中将信息导入链表中

这个实现起来挺简单的,就是写起来麻烦点,不是一点代码能写完的!
1,建立一个链表,链表的节点struct定义为联系人信息的格式;
2,读取文件,把内容存入链表;
3,查询就根据姓名关键字遍历链表就行了;
4,把内容存入文件;

首先建立链表,以及插入节点,查询链表函数写出来;
文件的读取和存入到不是很麻烦;
----------------------------下面是简单的实现,可以输入,存入文件,从文件读取,打印,如果还想要实现其他的稍修改一下就行了------

#include
#include
#include

#define MAX 80

struct stu{
int id;
char name[MAX];
struct stu* next;
};

typedef struct stu STU;
typedef STU* STUPTR;



STUPTR insert(STUPTR head, int id, char* name);
void print_st(STUPTR head);
void save_to_file(FILE* fp, STUPTR head);
FILE* crt_file( void );
STUPTR read_to_link(STUPTR head);


int main( void )
{

int choice;
int stu_id;
char stu_name[MAX];

STUPTR head;

FILE* fp;

clrscr();
head = NULL;





clrscr();

printf( "please enter the choice!
" );
scanf( "%d", &choice );

while( choice != 9 ){

switch(choice){
case 1: printf("enter the insert ----id---name!
");
scanf( "%d%s", &stu_id ,stu_name);
head = insert(head,stu_id,stu_name);
break;

case 2:print_st(head);
break;

case 3:puts("save the info to file e:\stu_info.txt!
");
fp = crt_file();
save_to_file( fp, head);
puts( "save the data sucessful!
");
fclose(fp);
break;

case 4:puts("read the file to link!
");
head = NULL;
head = read_to_link(head);
puts("read the file successful!
");
break;

}

printf( "please enter the choice!
");
scanf( "%d", &choice );
}



}


STUPTR insert(STUPTR head, int id, char* name)
{
STUPTR new, cur;

cur = head;

new = malloc( sizeof( STU) );

new->id = id;
strcpy(new->name, name);
new->next = NULL;

if(cur == NULL)
head = new;
else{
while(cur->next != NULL){
cur = cur->next;
}
cur->next = new;
}

return head;
}


void print_st(STUPTR head)
{
STUPTR cur=head;
int i;
i=1;

if(cur == NULL){
printf( "has no student info!
" );
}
else while(cur != NULL){
printf( "%d:------%d---%s
", i,cur->id,cur->name);
i++;
cur = cur->next;

}

}

void save_to_file(FILE* fp, STUPTR head)
{
int i;
STUPTR cur;

cur = head;

while(cur != NULL){
fprintf(fp, "%d %s
", cur->id,cur->name);
cur = cur->next;
}
}

FILE* crt_file(void)
{
FILE* fp;
fp = fopen( "e:\stu_info.txt", "w" ); /*w is right or not*/
if(fp == NULL)
puts("shit!!!!!!!!!!");
return fp;
}

STUPTR read_to_link( STUPTR head)
{

int id;
char name[MAX];

FILE* fp;
fp = fopen("e:\stu_info.txt", "r");



while( !feof(fp) ){
fscanf(fp, "%d%s", &id, name );
head = insert(head, id, name);
}

return head;

}


#include#include#includestruct node{ int num; node* next;}*h,*p;node *creat(){ node*h,*p,*q,*q1; int x,i; h=(node*)malloc(sizeof(node)); h->next=NULL; for(i=0;inum=x; q1=h; for(p=h->next;p&&p->numnext)q1=p; q->next=q1->next;q1->next=q; } return h;}int main(){ h=creat(); for(p=h->next; p; p=p->next) printf("%d ",p->num); return 0;}

#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语言 如何从键盘中输入若干个数保存到数组中
1、首先在电脑中打开编译器(vc++6.0),新建一个将1到100保存到数组中项目,如图所示。2、添加一个 assignment.c 文件,如图所示。3、包含stdio.h和stdlib.h头文件,如图所示。4、输入main函数主体及返回值,如图所示。5、定义一个char数组,长度为100,最后使用while循环进行赋值,如图所示,就完成...

将若干城市的信息存入一个带头节点的单链表,节点种的城市信息包括城市名...
\/\/循环为链表输入数据 cout<<"\\t name"<<endl;for(i=1;;i++){ cout<<i<<"\\t";cin>>temp->name;if(temp->name[0]!='*'){ temp->next=null;tail=temp;\/\/设置尾指针 } else{ delete temp;tail->next=NULL;break;} temp->next=new struct city;temp=temp->next;} } ...

用C语言实现从键盘上输入不确定个数的数字,将数字从小到大排序后输出...
对于输入的数据的个数不确定的情况,一般会预设一个特殊的非法值(这个值是属于论域之外的一个值)作为终止值,例如如果论域是正整数,则通常会将0作为终止值,即当输入0时结束,且0不作为有效数据。 因此如果你要输入的都是正整数,则程序可如下(对于其它情况可采用类似方法) #include <stdi...

c语言题:在键盘输入10个整数 逆序存放并输出
这样存储就会是倒序的了 然后再从下标为0开始递增输出到下标为9 另一种方法是创建两个数组 比如a和b,先顺序地将10个数据存储在a里 然后通过一个循环来将数据逆序存储在数组b里 这样数组b里就是逆序存储的了 最后顺序输出数组b 当然还有一种方法 可以使用一个链表(或者数组也可以)然后使用栈的方式...

c语言链表插入法求解下列问题?
根据题意:一、链表创建:根据输入的数字,动态创建任意多个节点插入链表。(题目规定n<=40,如不想使用malloc动态申请内存,需直接定义最大上限40个节点)。二、链表排序:交换节点内容(不是地址),保留链表指针的值(*next的值)。三、打印链表:利用链表指针遍历链表。四、对动态申请的链表地址空间...

用c语言编程,从键盘上输入10个整数存放到一维数组中,输出其中最大的数...
解题思路:先键盘输入10个整数,假设数组的第1个是最大数max,同时设置最大值下标为0,接着for循环依次判断其是否大于最大数,如果大于替换掉最大值,并更新最大值下标,最后输出最大数和数组下标。参考代码:include<stdio.h> int main() { int i,a[10],max,maxi;\/\/输入10个整数 for(i=0;...

...有5个学生,每个学生有3门课的成绩,从键盘输入以下数据(包括学号、姓 ...
i < 5; i++)\/\/输入信息,建立链表{node = malloc(sizeof(student));node->next = NULL;printf("输入学号、姓名、语文、数学、英语成绩:\\n");scanf("%d %s %lf %lf %lf", &node->number, node->name, &node->chinese, &node->math, &node->english);if (head == NULL)head =...

...整数小于0时才停止输入,然后逆序输出这些整型?(用C语言链表...
include <stdio.h>#include <stdlib.h>typedef struct NODE Node;struct NODE { int value; Node *next;};Node *head;int main(){ int num; Node *prev,*node; head=(Node *)malloc(sizeof(Node)); head->next=NULL; scanf("%d",&num); prev=NULL; while...

C语言实现单链表的建立、输入、插入、删除、查找元素并返回位置_百度知 ...
\/ 时间:2010年8月28日17:19:49 功能:C语言实现单链表的建立、输入、插入、删除、查找元素并返回位置 \/ include"stdio.h"include"stdlib.h"include"malloc.h"\/*假设输入的数据为3个--我比较好操作-_-*\/ define size 3 typedef struct List { int num;int shuju;struct List *next;}list;\/...

将若干城市的信息存入一个带头节点的单链表,节点种的城市信息包括城市名...
include <stdio.h> struct Point { float x;float y;};struct CityInfo { char name[20];struct Point m_p;struct CityInfo * next;void main(){ struct CityInfo * head;head=(struct CityInfo *)molloc(sizeof(struct CityInfo));...} 剩下的链表建立函数等就自己看着加吧......