链表到底啥意思?没弄太明白,请大牛帮忙讲一下,最好附带点程序段(c或c++)
h=(stud*)malloc(sizeof(stud)))==NULL一句中后面stud*)malloc(sizeof(stud))没弄明白什麽意思能把malloc用法...
h=(stud *)malloc(sizeof(stud)))==NULL
一句中后面stud *)malloc(sizeof(stud))没弄明白什麽意思
能把malloc用法说一下吗 展开
一句中后面stud *)malloc(sizeof(stud))没弄明白什麽意思
能把malloc用法说一下吗 展开
展开全部
一、单链表的建立
有了动态内存分配的基础,要实现链表就不难了。
所谓链表,就是用一组任意的存储单元存储线性表元素的一种数据结构。链表又分为单链表、双向链表和循环链表等。我们先讲讲单链表。所谓单链表,是指数据接点是单向排列的。一个单链表结点,其结构类型分为两部分:
1、数据域:用来存储本身数据
2、链域或称为指针域:用来存储下一个结点地址或者说指向其直接后继的指针。
例:
typedef struct node
{
char name[20];
struct node *link;
}stud;
这样就定义了一个单链表的结构,其中char name[20]是一个用来存储姓名的字符型数组,指针*link是一个用来存储其直接后继的指针。
定义好了链表的结构之后,只要在程序运行的时候爱数据域中存储适当的数据,如有后继结点,则把链域指向其直接后继,若没有,则置为NULL。
下面就来看一个建立带表头(若未说明,以下所指链表均带表头)的单链表的完整程序。
#include <stdio.h>
#include <malloc.h> /*包含动态内存分配函数的头文件*/
#define N 10 /*N为人数*/
typedef struct node
{
char name[20];
struct node *link;
}stud;
stud * creat(int n) /*建立单链表的函数,形参n为人数*/
{
stud *p,*h,*s; /* *h保存表头结点的指针,*p指向当前结点的前一个结点,*s指向当前结点*/
int i; /*计数器*/
if((h=(stud *)malloc(sizeof(stud)))==NULL) /*分配空间并检测*/
{
printf("不能分配内存空间!");
exit(0);
}
h->name[0]='\0'; /*把表头结点的数据域置空*/
h->link=NULL; /*把表头结点的链域置空*/
p=h; /*p指向表头结点*/
for(i=0;i<n;i++)
{
if((s= (stud *) malloc(sizeof(stud)))==NULL) /*分配新存储空间并检测*/
{
printf("不能分配内存空间!");
exit(0);
}
p->link=s; /*把s的地址赋给p所指向的结点的链域,这样就把p和s所指向的结点连接起来了*/
printf("请输入第%d个人的姓名",i+1);
scanf("%s",s->name); /*在当前结点s的数据域中存储姓名*/
s->link=NULL;
p=s;
}
return(h);
}
main()
{
int number; /*保存人数的变量*/
stud *head; /*head是保存单链表的表头结点地址的指针*/
number=N;
head=creat(number); /*把所新建的单链表表头地址赋给head*/
}
这样就写好了一个可以建立包含N个人姓名的单链表了。写动态内存分配的程序应注意,请尽量对分配是否成功进行检测。
有了动态内存分配的基础,要实现链表就不难了。
所谓链表,就是用一组任意的存储单元存储线性表元素的一种数据结构。链表又分为单链表、双向链表和循环链表等。我们先讲讲单链表。所谓单链表,是指数据接点是单向排列的。一个单链表结点,其结构类型分为两部分:
1、数据域:用来存储本身数据
2、链域或称为指针域:用来存储下一个结点地址或者说指向其直接后继的指针。
例:
typedef struct node
{
char name[20];
struct node *link;
}stud;
这样就定义了一个单链表的结构,其中char name[20]是一个用来存储姓名的字符型数组,指针*link是一个用来存储其直接后继的指针。
定义好了链表的结构之后,只要在程序运行的时候爱数据域中存储适当的数据,如有后继结点,则把链域指向其直接后继,若没有,则置为NULL。
下面就来看一个建立带表头(若未说明,以下所指链表均带表头)的单链表的完整程序。
#include <stdio.h>
#include <malloc.h> /*包含动态内存分配函数的头文件*/
#define N 10 /*N为人数*/
typedef struct node
{
char name[20];
struct node *link;
}stud;
stud * creat(int n) /*建立单链表的函数,形参n为人数*/
{
stud *p,*h,*s; /* *h保存表头结点的指针,*p指向当前结点的前一个结点,*s指向当前结点*/
int i; /*计数器*/
if((h=(stud *)malloc(sizeof(stud)))==NULL) /*分配空间并检测*/
{
printf("不能分配内存空间!");
exit(0);
}
h->name[0]='\0'; /*把表头结点的数据域置空*/
h->link=NULL; /*把表头结点的链域置空*/
p=h; /*p指向表头结点*/
for(i=0;i<n;i++)
{
if((s= (stud *) malloc(sizeof(stud)))==NULL) /*分配新存储空间并检测*/
{
printf("不能分配内存空间!");
exit(0);
}
p->link=s; /*把s的地址赋给p所指向的结点的链域,这样就把p和s所指向的结点连接起来了*/
printf("请输入第%d个人的姓名",i+1);
scanf("%s",s->name); /*在当前结点s的数据域中存储姓名*/
s->link=NULL;
p=s;
}
return(h);
}
main()
{
int number; /*保存人数的变量*/
stud *head; /*head是保存单链表的表头结点地址的指针*/
number=N;
head=creat(number); /*把所新建的单链表表头地址赋给head*/
}
这样就写好了一个可以建立包含N个人姓名的单链表了。写动态内存分配的程序应注意,请尽量对分配是否成功进行检测。
展开全部
我通俗点说吧。先解释指针的概念。
电脑存储信息,最重要的两个名词是存储单元内容和存储单元地址。存储单元内容是我们要存下来的信息,但是电脑的信息多的数不清,电脑怎么去找呢,每个存储单元对应一个地址,通过存储单元的地址去找。
形象一点就是这样的,存储单元相当于宾馆里的房间,而我们住在宾馆里的人相当于存储单元内容,而存储单元地址就相当于门牌号,这个宾馆很大,住的人多,如果我要找一个人,可以问一下门牌号,然后就很容易找到那个人了。
指针就是一种这样的变量,专门存放存储单元地址的变量。比如我们可以定义一个存放存储单元B地址的指针a。如果我要找B存储单元的内容,首先我要获取的它的地址,其中一个途径就是利用访问a的内容来得到存储单元B的地址,在去访问存储单元B的内容,即指向B的指针a。
那么链表是什么呢?它实际上是N个结构体的集合。这个结构体存放两个东西,一个是变量(值),另一个就是指向另一个结构体的指针。我们可以访问一个结构体,获取到它里面的内容,同时我们还可以通过它的指针访问另一个结构体,以此类推,就可以访问一串结构体了,这就是链表。
电脑存储信息,最重要的两个名词是存储单元内容和存储单元地址。存储单元内容是我们要存下来的信息,但是电脑的信息多的数不清,电脑怎么去找呢,每个存储单元对应一个地址,通过存储单元的地址去找。
形象一点就是这样的,存储单元相当于宾馆里的房间,而我们住在宾馆里的人相当于存储单元内容,而存储单元地址就相当于门牌号,这个宾馆很大,住的人多,如果我要找一个人,可以问一下门牌号,然后就很容易找到那个人了。
指针就是一种这样的变量,专门存放存储单元地址的变量。比如我们可以定义一个存放存储单元B地址的指针a。如果我要找B存储单元的内容,首先我要获取的它的地址,其中一个途径就是利用访问a的内容来得到存储单元B的地址,在去访问存储单元B的内容,即指向B的指针a。
那么链表是什么呢?它实际上是N个结构体的集合。这个结构体存放两个东西,一个是变量(值),另一个就是指向另一个结构体的指针。我们可以访问一个结构体,获取到它里面的内容,同时我们还可以通过它的指针访问另一个结构体,以此类推,就可以访问一串结构体了,这就是链表。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
链表的理论知识楼上的两位都说了,我就不再废话了。如果你实在抽象不出来,就想想一条锁链。数据域相当于锁链上的每个环,链域相当于环之间的衔接口。我个人觉得,链表应该是数据结构中最简单的一种结构了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询