❶ c语言怎么建一个链表,书上的看不懂,求图解,详解。高分!!!
学习链表 基础知识 指针和结构体
先建立一个结构体,结构体包含一个数据域和一个指向结构体的指针
比如
typedef struct{
int data; //数据域
PCHAIN pNext; //指向下一个数据
}CHAIN,*PCHAIN;
接着把数据相接起来 比如
PCHAIN pHeader; //这是一个头 指向数据开头
CHAIN tChainData1,tChainData2; //第一个数据 第二个数据.....
pHeader=&tChainData1; //指向第一个数据
tChainData1.pNext=&tChainData2; //第一个数据 连接第二个数据 依次类推
这只是我随便写的简单链表,不过大意都是这样的
❷ C语言链表的使用方法
D
答案D设置完,p就从链表中丢掉了。
p就是一个指向结构体node的指针。
p->next就是p包含的执行下一个node的指针,在本题,就是q。
❸ C语言 链表 如何理解
满意答案飞狙仔16级2011-01-18别听那人忽悠你,想学数据结构并不需要链表的基础。当然,链表也很重要,以线性表为例:链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,链表比较方便插入和删除操作。 追问: 前辈,能发个代码上来说明一下吗?书本上的我看不明白。 回答: 比如:#include #include struct link{int data;struct link *next; }; void create(struct link *h,int n){int i;struct link *k; h=(struct link *)malloc(sizeof(struct link)); h-> next=NULL; for(i=n;i> 0;i--){k=(struct link *)malloc(sizeof(struct link));k->data=i;k->next=h->next;h->next=k;}k=h->next;for(i=0;idata);k=k->next;}printf("\n"); }int main(){struct link l; system("pause");return 0;} 结果: 追问: 前辈,不是C++的头文件吗? 回答: 你不是说C语言的链表吗?就得自己写个数据结构。C++默认的链表类是基于STL的。建议你看一下书。 追问: 啊?我C语言都没有学好,就去看C++? 回答: 呵呵,不是这个意思。刚才那个程序是C的。C++的STL中有自带的链表类,建议你以后学习。把握链表,核心是结点,结点核心就是数据+指针。多看几个例子,比如严蔚敏的数据结构,就写的很好。
❹ 求c语言链表的详细讲解
链表是一种常见的重要的数据结构.它是动态地进行存储分配的一种结构.我们知道,用数组存放数据时,
必须事先定义固定的长度(即元素个数).比如,有的班级有100人,而有的班只有30人,如果要用同一个数组先后存放不同班级的学生数据,则必须定义长度为100的数组.如果事先难以确定一个班的最多人数,则必须把数组定得足够大,以能存放任何班级的学生数据.显然这将会浪费内存.链表则没有这种缺点,它根据需要开辟内存单元.图10.11表示最简单的一种链表(单向链表)的结构.链表有一个"头指针"变量,图中以head表示,它存放一个地址.
该地址指向一个元素.链表中每一个元素称为"结点",每个结点都应包括两个部分:一为用户需要用的实际数据,二为下一个结点的地址.课以看出,head指向第一个元素;第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为'表尾",它的地址部分放一个"NULL"(表示"空地址").链表到此结束.
可以看到:链表中各元素在内存中可以不是连续存放的.要找某一元素,必须先找到上一个元素,根据它提供的下一元素地址才能找到下一个元素.
如果不提供"头指针"(head),则整个链表都无法访问.链表如同一条铁链一样,一环扣一环,中间是不能断开的.打个通俗的比方:幼儿园的老师带领孩子出来散步,老师牵着第一个小孩的手,第一个小孩的另一只手牵着第二个孩子,……,这就是一个"链",最后一个孩子有一只手空着,他是"链尾".要找这个队伍,必须先找到老师,然后顺序找到每一个孩子.
❺ c语言中链表讲解视频教程
1.图文教程:
网络文库、新浪爱问里搜索;
2.视频教程:
网易视频学院、网络课程、优酷、51自学网里搜索,应该会有;
及各网站的公开课
3.下载地址:
网络搜索【逛电驴】和【迅雷方舟】然后转到逛电驴网与迅雷方舟网可进行资源搜索及下载
另外网络文库里的文档也有许多下载地址
4.复制地址后用迅雷下载即可
5.------------------@选为满意答案@------------------
❻ c语言链表逆置详解
思路 ==》创建一个新的链表,然后顺序遍历原链表,将其每一项都前插到新链表中。这样得到的新链表就是原链表的逆向链表例子看下面的#include <stdio.h>
//结构体,用整数作数据
typedef struct tNODE
{
int data;
struct tNODE *next;
}NODE;
//删除链表,回收空间
void clear(NODE *head)
{
NODE *p;
while(head)
{
p=head->next;//保存下一个结点的地址
free(head);//删除最先的一个结点
head=p;//指向下一个结点
}
}
//输出整个链表中的数据
void write(NODE *head)
{
NODE *p;
p=head->next;//因为使用带头结点的链表,所以要跳过第一个结点
while(p)
{
printf("%d ", p->data);
p=p->next;//后移
}
printf("\n");
}
//链表逆序
void reverse(NODE *head)
{
NODE *p, *q, *r;
if(head->next)//至少有一个数据
{
p=head->next;//p指向第一个数据结点
q=p->next;//q指向第二个结点
p->next=NULL;//第一个结点逆序后当然就是最后一个
while(q)
{
r=q->next;//r指向第三个结点
q->next=p;//第二个结点的链指针指向第一个
p=q;//p指向第二个结点
q=r;//q指向第三个结点
}
head->next=p;//让始终没理的头结点连到最后一个结点上
}
}
//生成链表,以-1表示结束
NODE *create()
{
NODE *h, *t;
int x;
h=malloc(sizeof(NODE));//建立头结点
t=h;
scanf("%d", &x);
while(x!=-1)
{
t->next=malloc(sizeof(NODE));
t=t->next;
t->data=x;
scanf("%d", &x);
}
t->next=NULL;
return h;
}
int main()
{
NODE *head;
head=create();
write(head);
reverse(head);
write(head);
clear(head);
return 0;
}
❼ C语言中的链表怎么理解
链表是相同类型的若干个结构体用其自身携带的指针按照一定顺序串联成的一个链。
举个简单例子进行类比:
struct node{
int a;
struct node *next;
};
把这个链表节点的结构体struct node看作是人,结构体内的next指针看作是人的一只手,这只手只能用于指向人(别人或自己)。
如果有多个人排成一排,每个人都举起右手指向右边的人,就形成一个人组成的链表。
❽ 在C语言中,什么是链表呀
链表
链表链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,链表比较方便插入和删除操作。
概况
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表:顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O(1)。使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。在计算机科学中,链表作为一种基础的数据结构可以用来生成其它类型的数据结构。链表通常由一连串节点组成,每个节点包含任意的实例数据(data fields)和一或两个用来指向明上一个/或下一个节点的位置的链接("links")。链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。而链表是一种自我指示数据类型,因为它包含指向另一个相同类型的数据的指针(链接)。链表允许插入和移除表上任意位置上的节点,[1]但是不允许随机存取。链表有很多种不同的类型:单向链表,双向链表以及循环链表。链表可以在多种编程语言中实现。像Lisp和Scheme这样的语言的内建数据类型中就包含了链表的存取和操作。程序语言或面向对象语言,如C,C++和Java依靠易变工具来生成链表。
编辑本段特点
线性表的链式存储表示的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。因此,为了表示每个数据元素 与其直接后继数据元素 之间的逻辑关系,对数据元素 来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。由这两部分信息组成一个"结点"(如概述旁的图所示),表示线性表中一个数据元素 。
编辑本段扩展
根据情况,也可以自己设计链表的其它扩展。但是一般不会在边上附加数据,因为链表的点和边基本上是一一对应的(除了第一个或者最后一个节点,但是也不会产生特殊情况)。不过有一个特例是如果链表支持在链表的一段中把前和后指针反向,反向标记加在边上可能会更方便。 对于非线性的链表,可以参见相关的其他数据结构,例如树、图。另外有一种基于多个线性链表的数据结构:跳表,插入、删除和查找等基本操作的速度可以达到O(nlogn),和平衡二叉树一样。 其中存储数据元素信息的域称作数据域(设域名为data),存储直接后继存储位置的域称为指针域(设域名为next)。指针域中存储的信息又称做指针或链。 由分别表示,,…, 的N 个结点依次相链构成的链表,称为线性表的链式存储表示,由于此类链表的每个结点中只包含一个指针域,故又称单链表或线性链表.
编辑本段三个链表函数(C语言描述)
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
struct Node{
int data;//数据域
struct Node * next;//指针域
}; /************************************************************************************** *函数名称:insert
*函数功能:在链表中插入元素. *输入:head 链表头指针,p新元素插入位置,x 新元素中的数据域内容 *输出:无 *************************************************************************************/ void insert(Node * head,int p,int x)
{ Node * tmp = head; //for循环是为了防止插入位置超出了链表长度 for(int i = 0;i<p;i++)
{
if(tmp == NULL)
return ;
if(i<p-1)
tmp = tmp->next;
}
Node * tmp2 = new Node;
tmp2->data = x;
tmp2->next = tmp->next;
tmp->next = tmp2;
} /************************************************************************************** *函数名称:del *函数功能:删除链表中的元素 *输入:head 链表头指针,p 被删除元素位置 输出:被删除元素中的数据域.如果删除失败返回-1 **************************************************************************************/
int del(Node * head,int p)
{
Node * tmp = head;
for(int i = 0;i<p;i++)
{
if(tmp == NULL)
return -1;
if(i<p-1)
tmp = tmp->next;
}
int ret = tmp->next->data;
tmp->next = tmp->next->next;
return ret;
}
void print(Node *head)
{
for(Node *tmp = head;
tmp!=NULL; tmp = tmp->next)
printf("%d ",tmp->data);
printf("\n");
}
int main()
{
Node * head;
head = new Node;
head->data = -1;
head->next=NULL;
return 0;
}
编辑本段结语
C语言是学习数据结构的很好的学习工具。理解了C中用结构体描述数据结构,那么对于理解其C++描述,Java描述都就轻而易举了!
编辑本段两种链表形式
一、循环链表 循环链表是与单链表一样,是一种链式的存储结构,所不同的是,循环链表的最后一个结点的指针是指向该循环链表的第一个结点或者表头结点,从而构成一个环形的链。 循环链表的运算与单链表的运算基本一致。所不同的有以下几点: 1、在建立一个循环链表时,必须使其最后一个结点的指针指向表头结点,而不是象单链表那样置为NULL。此种情况还使用于在最后一个结点后插入一个新的结点。 2、在判断是否到表尾时,是判断该结点链域的值是否是表头结点,当链域值等于表头指针时,说明已到表尾。而非象单链表那样判断链域值是否为NULL。
二、双向链表 双向链表其实是单链表的改进。 当我们对单链表进行操作时,有时你要对某个结点的直接前驱进行操作时,又必须从表头开始查找。这是由单链表结点的结构所限制的。因为单链表每个结点只有一个存储直接后继结点地址的链域,那么能不能定义一个既有存储直接后继结点地址的链域,又有存储直接前驱结点地址的链域的这样一个双链域结点结构呢?这就是双向链表。 在双向链表中,结点除含有数据域外,还有两个链域,一个存储直接后继结点地址,一般称之为右链域;一个存储直接前驱结点地址,一般称之为左链域。
❾ C语言链表的思路
链表的一种数据格式:
typedefintDataType;
typedefstructLinkNode
{
DataTypedata;
structLinkNode*next;
}LinkNode;
LinkNode*Create_LinkList()
{
LinkNode*h=NULL;//指向链表第一个数据节点
LinkNode*tail=NULL;//指向链表最后一个节点
while(1)
{
//用户不断的输入数据,直到输入负数
intinput;
scanf("%d",&input);
if(input<0){
break;
}
//申请新节点内存
LinkNode*newNode=(LinkNode*)malloc(sizeof(LinkNode));
//设置新节点的next
newNode->next=NULL;
//填充数据
newNode->data=input;
//添加到链表尾
if(h==NULL){
//若表头为NULL,说明新节点为第一个节点,则表头和表尾都为新节点
h=tail=newNode;
}else{
//否则将tail->next指向新节点,并更新表尾
tail->next=newNode;
tail=newNode;
}
}
//返回链表第一个节点的指针
returnh;
}
❿ C语言中有关链表的基础知识
举个例子:假设你想到C的家中拿一样东西,但你不知道C家的地址,不过,你知道A家的地址,A家有B的地址,B有C的地址,
所以,你到A处找到B的地址,再去B处找到C的地址,就知道C的地址了。链表就是这个意思,每一个元素都保存有下一个元素的地址,根据这个地址,你可以依次找到最后一个元素,故形成了一个链。
这个代码,重点就在于结构体,结构体名是:node 其中包含两个成员变量,一个是 int类型的数据,一个就是 例子中的 “ 地址 ”,这个 “ 地址 ” 是一个变量的地址,而这个变量又是你定义的结构体 node 的存储位置,而这个变量又包含两个变量(int数据和 “ 地址 ” ),这样就形成了链表。
以后你会知道这种 ‘ 地址 ’ 就是一种变量 叫 指针。