c语言链表图
⑴ c语言链表问题 如,运行答案是3-4-1-2 最好能附上图中链表图①②两个式子的链表图尽量详细!
while循环外,困缺隐链表为
k四次循环后为4
p1->num 如图为 3
p1=p1->next;
所以输出为 3 4 1 2
⑵ 求c语言链表的详细讲解
链表是一种常见的重要的数据结构.它是动态地进行存储分配的一种结构.我们知道,用数组存放数据时,
必须事先定义固定的长度(即元素个数).比如,有的班级有100人,而有的班只有30人,如果要用同一个数组先后存放不同班级的学生数据,则必须定义长度为100的数组.如果事先难以确定一个班的最多人数,则必须把数组定得足够大,以能存放任何班级的学生数据.显然这将会浪费内存.链表则没有这种缺点,它根据需要开辟内存单元.图10.11表示最简单的一种链表(单向链表)的结构.链表有一个"头指针"变量,图中以head表示,它存放一个地址.
该地址指向一个元素.链表中每一个元素称为"结点",每个结点都应包括两个部分:一为用户需要用的实际数据做备大,二为下一个结点的地址.课以看出,head指向第一个元素;第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为'表尾",它的地址部分放一个"NULL"(表示"空地址").链表到此结束.
可以看到:链表中各元素在内存中滚配可以不是连续存放的.要找某一元素,必须先找到上一个元素,根据它提供的下一元素地址才能找到下一个元素.
如果不提供"头指针"(head),则整个链表都无法访问.链表如同一条铁链一样,一环扣一环,中间是不能断开的.打个通俗的比方:幼儿园的老师带领孩子出来散步,老师牵着第一个小孩的手,第一个小孩的另一只手牵着第二个孩子,……,这就是一纯竖个"链",最后一个孩子有一只手空着,他是"链尾".要找这个队伍,必须先找到老师,然后顺序找到每一个孩子.
⑶ c语言链表,非常感谢
//WIN-TC是什么turbo? 我在DEV-C下改的,应该也没问题吧
#include<stdio.h>
#include<malloc.h>
//#define NULL 0 //不用重定义NULL把,空指针用NULL就可以
struct student
{
int num;
char name[20];
float score;
struct student *next;
};
int n=0;
/*建立动态链表*/
/* 这个函数猛歼,有重要的问题,你在函数里创建了临时类,st,head指向它,但是当这个函数结束时,这个类会被销毁,head将是个没有指向的指针,所以当在明知旦函数中返回类时,需要堆分配内存
*/
struct student *creat(void)
{
struct student *p1=NULL,*head=NULL; // 这里一个学生类指针即可
struct student *st = (struct student *)malloc(sizeof(struct student)); //同上解释
printf("Please input records:\n");
scanf("%d%s%f",&(st->num),st->name,&(st->score));
p1=st;
p1->next = NULL;
if(st->num!=0)
head=p1;
while(p1->num!=0)
/*这个链表的创立,无非就是那些步骤,你必然明白,再不行,画个示意图就明白了,注意的是,什么时候指针赋值,什么时候用指针控制变量
*/
{n=n+1;
printf("%dEnd\n",n);
p1->next = (struct student *)malloc(sizeof(struct student));
//这句话至少得有一个“->”,需要控制变量
p1->next->next = NULL;
scanf("%d%s%f",&(p1->next->num),p1->next->name,&(p1->next->score));
if(n!=1)
{
p1 = p1->next;
}
}
printf("\nOver.\n");
/*printf("%o\激扰n",head);
if(head!=NULL)
printf("%10d%10s%10.1f\n",head->num,head->name,head->score);*/
return(head);
}
/*输出*/
void print(struct student *head)
{
struct student *p;
p=head;
/*printf("%o\n",head);*/
getch();
//if(head==NULL)
//printf("\nList null!\n");
//else
printf("\nNow,there are %d records:\n",n);
while(p!=NULL)
{
printf("%10d%10s%10.1f\n",p->num,p->name,p->score);
p=p->next;
}
}
int main()
{
struct student *head;
head=creat();
/*printf("%o\n",head);
if(head!=NULL)
printf("%10d%10s%10.1f\n",head->num,head->name,head->score);*/
print(head);
getch();
return 0;
}
/*还有些小问题,如应该创建个销毁链表函数,使堆中内存被释放,等
但不影响达到效果,做个示意够了
*/
⑷ c语言 链表流程图 怎么画呀
你一步步往下分,流程图不就出来了,比如你的例子:
首先就是p1->number,即p1指向的结点
分不等于0,小于0,等于0 三种情况,
然后再往下分,比如p1->number!=0时
=>n=n+1
判断n
如果为真怎么样,为假又怎么样(继续走)。。。。
就是麻烦点,一步步来流程图就出来。不过。。。这种东西用流程图表示,太麻烦了吧。。。
⑸ C语言 如图 链表 这个程序表示什么作用
这题建立了一段咐陵个头节点握戚保存值的链表,链表中每一个节点保存的信息有学号,姓名和成绩。
没有输出部分,如果要查看链表中的数据,需要编写输简氏出。
⑹ C语言如何创建单链表
C语言创建单链表如下:
#include"stdio.h"
#include"stdlib.h"
#include"malloc.h"
#include "iostream.h"
typedef struct node
{
intdata;
node * next;
}node , * List;
void create(int n)
{
int c;
List s,L;
L=(List)malloc(sizeof(node));
L->next=NULL;
printf("请输入第1个数据:");
scanf("%d",&c);
L->data=c;
for(int i=2;i<=n;i++)
{
s=(List)malloc(sizeof(node));
printf("请输入第%d个数据:",i);
scanf("%d",&c);
s->data=c;
s->next=L;
L->next =s;
}
printf("链表创建成功!");
}
void main()
{
int n;
printf("请你输入链表的个数:");
scanf("%d",&n);
create(n);
}
⑺ 用c语言建立一个有序链表
先按正常流程建立一个链表,再按照其某一个成员值进行冒泡排序(排序过程的交换,只交换链表指针以外的成员值)。
演示代码如下:(演示代码链表20个节点,成员值为随机值)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct slist
{
int a;
struct slist *next;
}SLIST;
SLIST *init();//生成20个节点成员为随机数的链表
void showList(SLIST *slHead);//打印链表
void px(SLIST *slHead,int flag);//float=1:降序。=2升序
int main()
{
SLIST *slHead=NULL;
slHead=init();
printf("排序前: ");
showList(slHead);
printf(" 降序排序后: ");
px(slHead,1);
showList(slHead);
printf(" 升序排序后: ");
px(slHead,2);
showList(slHead);
return 0;
}
void px(SLIST *slHead,int flag)//flag=1:降序。=2升序
{
SLIST *sl0=slHead->next,*sl1=NULL,slSave,*pSave=NULL;
while(sl0)
{
sl1=sl0->next;
while(sl1)
{
if((flag==1 && sl0->a<sl1->a)||(flag==2 && sl0->a>sl1->a))
{
slSave=*sl0;
*sl0=*sl1;
sl0->next=slSave.next;
pSave=sl1->next;
*sl1=slSave;
sl1->next=pSave;
}
sl1=sl1->next;
}
sl0=sl0->next;
}
}
void showList(SLIST *slHead)
{
int i=0;
while(slHead->next)
{
printf("节点%d成员值:%d ",++i,slHead->next->a);
slHead=slHead->next;
}
printf(" ");
}
SLIST *init()
{
int num,cnt=20;
static SLIST head;
SLIST *slHead=&head,*slTail=NULL,*slNew=NULL;
slHead->next=NULL;
srand(time(NULL));
while(cnt--)
{
num=rand()%100;
slNew=(SLIST *)malloc(sizeof(SLIST));
if(!slNew)return NULL;
slNew->a=num;
slNew->next=NULL;
if(!slHead->next)
slHead->next=slNew;
else
slTail->next=slNew;
slTail=slNew;
}
return slHead;
}
⑻ c语言链表,不太懂,画图解释一下这道题
structnode*ave(structnode*h,int*count){
structnode*p1;//不需要p2
floatsume=0,sum=0;
*count=0;
if(h==塌镇埋NULL)returnNULL;
p1=h;
while(p1!=NULL){//(19):直接填p1也有同样的效果
sume+=p1->English;
sum+=p1->math;
p1=p1->next;//(20):向前移动指针
}//原代码中缺少这个右括号,真是害人不浅
//接下来将新建的结点添加到原链表的头部,并返团蚂回该旅谨结点地址
}
⑼ C语言用链表进行数据录入,图片第三张是我的问题,希望大神能给我画个示意图。
head指向头结点,返回head时返回head指向的链表;
head在开辟空间是就已经指向了头结点,后面使用的是p1,p2之类的指针指向head(也就是指向头结点),对闹乎p1,p2操作也就是对head指向的节点所在的链表进行操明坦作,返回时返液槐悉回head,没毛病