C语言,用链表是不是可以扩大读取数量,怎么改一下? 约瑟夫环c语言链表
c语言链表如何修改一个数?
获取了那个节点的指针了吗?没获取就只有从头节点一个一个找直到数据与你要修改的节点的数据相同为止,然后你就可以赋值了
C语言中链表的存储、读取、修改问题
1、链表存到文件中去后,再取出来是不是要再次对各个元素进行链表的关联(就是下一个元素地址赋予前一个元素中的地址变量中)?有没有更简单的方法让其自动恢复原先的链表关系?
答:链表的关系的却需要重新建立,没有别的方法,这里只需要重新设置,因为链表是存储在内存中的,每次malloc出来的指针地址不一致,无法存储到文件中,下次继续使用。
2、编辑前,是否需要将整个文件流从文件中都读取至堆里去,连立成一个链表?如果文件很大,大过内存怎么办?
答:文件中存储的是整个链表的信息,你只需要每次读出一个struct就可以了。这个malloc出来的struct中你需要读取一个index的值,然后以这个index的值再建立一个链表,将原来那个malloc出来的struct可以释放,这样就可以不用担心文件很大,怕内存不足的情况。因为即使你的链表再长,一个int值足以表示。如果怕int(4字节)不够,可以用double类型,甚至可以用链表嵌套。
3、如果整个文件都读出至堆中,并关联成了链表,那么修改后用fwrite()再次保存至文件中时,是不是把原来的记录都覆盖了还是在后面追求啊?
答:这里写文件就看你自己是怎么打开文件了。(存储的时候是不是按照struct大小存储还是按照实际数据大小存储)最好的方式是可以随便修改,这种方式最难,因为要考虑到更改的是第几个字节。最简单的方式,直接将文件删除,重新建立,但是这样就必须要将所有数据读取到内存中。
如果你要实现问题2中的方法,则问题3即要做大量的修改。
c语言,数据结构。请问创建链表和节点是不是只要增加一个节点就要使用一下malloc函数和创建一个指针?
如果是动态分配内存 每添加一个节点就需要申请一次内存空间
但是如果是静态内存 也就是说你一开始就算好这个列表中只有十个节点 那么你在一开始就malloc十个节点的内存的话后面就不需要重新malloc了
C语言——链表的修改
#include
#include
#define LEN sizeof(struct student)
struct student
{
int num;
char name[20];
float score[3];
struct student *next;
};
int n=0;
struct student *creat(void) //建立链表
{
struct student *head,*p1,*p2;
p1=p2=(struct student *)malloc(LEN);
head=NULL;
scanf("%d %s %f %f %f",&p1->num,p1->name,&p1->score[0],&p1->score[1],&p1->score[2]);
while(p1->num!=0)
{
n=n+1;
if(n==1)
head=p1;
else p2->next=p1;
p2=p1;
p1=(struct student *)malloc(LEN);
scanf("%d %s %f %f %f",&p1->num,p1->name,&p1->score[0],&p1->score[1],&p1->score[2]);
}
p2->next=NULL;
return (head);
}
void main() //main函数
{
struct student *insert(struct student *head,struct student *stu);
struct student *del(struct student *head,int num);
struct student *p, *b,*stu;
int m,flag=1,flag1=1,flag2=1;
b=p=creat();
printf("now,there are %d crunodes are:\n",n);
for(;p!=NULL;)
{
printf("%d%10s%8.2f%8.2f%8.2f\n",p->num,p->name,p->score[0],p->score[1],p->score[2]);
p=p->next;
}
while(flag2!=0) //控制开关
{
printf("if you input '1' that you will have the funtion to delete the crunode\nif you input '2' that you will have the funtion to insert crunode.\nif you input '0' that you will end.\n");
printf("what you want to enter 1 ,2 or 0:");
scanf("%d" ,&flag2);//选择功能,是增加结点还是删减结点
if(flag2==1)
{
while(flag)
{
printf("delete the crunode(结点):");
scanf("%d",&m);
p=del(b,m);
if(n==0)
{
b=p;
flag=0;
break;
}
b=p;
printf("now,there are %d crunodes are:\n",n);
for(;p!=NULL;)
{
printf("%d%10s%8.2f%8.2f%8.2f\n",p->num,p->name,p->score[0],p->score[1],p->score[2]);
p=p->next;
}
printf("contiune or not(0/1):");
scanf("%d",&flag);
}
}
if(flag2==2)
{
while(flag1)
{
if(flag)//第一次是不执行这句的
{
if(n==0) b=NULL;
p=insert(b,stu);
b=p;
printf("now,there are %d crunodes are:\n",n);
for(;p!=NULL;)
{
printf("%d%10s%8.2f%8.2f%8.2f\n",p->num,p->name,p->score[0],p->score[1],p->score[2]);
p=p->next;
}
printf("continue or not :(0/1):");
scanf("%d",&flag1);
if(flag1==0) break;
}
//起到控制整个while循环的作用
printf("please input the imformation of the student who you want to add:");
stu=(struct student *)malloc(LEN); //申请内存
scanf("%d %s %f %f %f",&stu->num,stu->name,&stu->score[0],&stu->score[1],&stu->score[2]);//输入学生的信息
flag=1;
// 起到控制作用,目的是为了第一次不执行上上个if语句
}
}
}
}
struct student *del(struct student *head,int num) //删除结点
{
struct student *p1,*p2;
if(head==NULL)
{
printf("this is list null.\n");
return head;
}
else
p1=head;
while(num!=p1->num && p1->next!=NULL)
{
p2=p1;p1=p1->next; //一个一个的下去
}
if(num==p1->num)
{
if(p1==head) //才一个结点
{
head=p1->next;
free(p1);
}
else //不止一个结点
{
p2->next=p1->next;
free(p1);
}
n=n-1;
printf("delete:%d\n",num);
printf("there are %d crunode(结点) now.\n",n);
}
else
printf("%d crunode(结点) has not been found!\n",num);
if(n==0) //如果删除结点后结点个数为0
return NULL;
else
return (head);
}
struct student *insert(struct student *head,struct student *stu) //增加结点
{
struct student *p1,*p2,*p0;
p1=head;
p0=stu;
if(head==NULL)
{
head=p0;
p0->next=NULL;
}
else
{
while(p0->num>p1->num && p1->next!=NULL)
{
p2=p1;p1=p1->next;
}
if(p0->num<=p1->num)
{
if(head==p1) //插到第一个结点前
{
head=p0;
p0->next=p1;
}
else
{
p2->next=p0;
p0->next=p1;
}
}
else
{
p1->next=p0;
p0->next=NULL;
}
}
n=n+1;
return(head);
}
我正好学到链表的,所以就话了一个晚上来做了这个,我哦完善了一下,如果有什么不满意的话,或有什么不懂的话你可以加QQ419842687