既然百度上都有了我就说说我的理解
我觉得‘’链表‘’故名思义就是将一些东西连锁起来成一个串,或者环形的,想来想去如果这些东西一一对应那就只有线和环两种形态了
而这些东西就是数据,我理解就是一个个变量,或者书中所说的节点,链接他们的东西就是指针了
传说是约瑟夫提出这么一个问题编号为1,2, 。。。,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报到m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。试设计一个程序求出出列顺序。
这里,选择使用链表来实现,具体的使用单链表中的循环链表来实现。
首先先说下链表的实现,
1>为了创建一个链表,首先先建一个节点结构:前面说到有变量和线索链接(定义成数据域和指针)
struct Node{节点的数据域存放计算的数据,节点的next指针域存放指向下一节点的地址
2>然后创建我们的链表类List类,在List类中我们要添加实现链表操作的方法,(这些就算是基本操作了)包括:
List();还要添加一个私有成员, Node *head; 即头指针;
构造函数: 初始化head = NULL;
插入操作:
首先新建节点并初始化,
Node *s;进行一下判断:
(1).if(head==NULL)//头指针为空
(2).Node *p = head;
if(p->Data==val)//插入点为第一个节点
(3).Node *q;
while(p->Data != val)//循环寻找插入节点
(4).if(p->next == NULL)//插入节点是尾节点
删除操作:
首先建两个指针,Node *p,*q;判断:
(1).if(head == NULL)//链表为空
(2).p= head;
if(p->Data == val)//删除节点是第一个节点
(3).while((p->Data != val)&&(p->next != NULL))//循环寻找删除节点
(4).if(p->Data == val)找到节点
if(p->next == NULL)//节点不存在
判空操作:
这是一个可选的方法,return head == NULL;//判断链表是否为空
输出操作:
定义一个指针,Node *current;
初始化为 current = head;
循环输出 while(current->next != NULL)
以上就是一个能实现基本操作的链表类,这里只给出了算法,希望能够理解
3>下面说下约瑟夫算法的实现,使用循环链表
循环链表同单链表基本相似,只是循环链表尾节点的next指针始终指向链表的首地址,因此在插入删除操作时会有些不同的地方
节点结构同上,
为了实现约瑟夫算法
添加如下方法:
List();构造函数:
head= (Node*)new(Node);插入操作:
//这里为了具体实现约瑟夫算法,只是在链表的结尾添加数值删除操作:
//这里和单链表不太一样输出操作:
Node *current = head->next;判空操作:
return head->Data == 0;计算操作:
Node *temp;//用来存放循环的下一节点的指针这里想说的是,在删除循环链表的第一个节点的时候,不要忘了给尾节点的next指针赋一个新的值!
C语言链表很不明白,求详细说一下,非常感谢
首先先说下链表的实现,1>为了创建一个链表,首先先建一个节点结构:前面说到有变量和线索链接(定义成数据域和指针)struct Node{ int Data; Node *next;};节点的数据域存放计算的数据,节点的next指针域存放指向下一节点的地址 2>然后创建我们的链表类List类,在List类中我们要添加实现链表操...
麻烦讲解一下C语言中的链表
一般链表在应用时,会额外建立一个链表头。在链表头里会有一些方便对链表操作的东西。比如你说的free指针,链表的第一节点地址,链表的尾地址,甚至一些控制变量如链表容量等 至于链表的具体应用很复杂,但其根本不会改变,并且链表的数据区可以是任何类型的数据,甚至可以是子链表。
C语言动态链表不知道怎么输出节点数据
int main() { int i,x,y; point *head,*p; head = p = (point *)malloc(sizeof(point)); while(scanf("%d%d",&x,&y) != 2) { p->next = (point *)malloc(sizeof(point)); p->next->x = x; p->next->y = y; p = p->next; } p...
求c语言链表的详细讲解
图中以head表示,它存放一个地址.该地址指向一个元素.链表中每一个元素称为"结点",每个结点都应包括两个部分:一为用户需要用的实际数据,二为下一个结点的地址.课以看出,head指向第一个元素;第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为'表尾",它的地址部分...
C语言关于链表的问题
1,string 是关键词,你应该知道,怎么可以用它来命名结构体呢?2.你的链表很有问题,链表不是这样写的 ,对于链表,要在他的尾指针处加上NULL,这样可以防止内存泄漏,3,程序要分层,比如,你对你的链表,你都没有办法检测这个链构建的对不对,应该在结构体后面至少分成两个函数,一个负责链表的...
一口气玩转链表(C语言版)
节点与头结点链表中的每个元素被称为节点,包含数据域和指针域。头结点并非必需,但用于标识链表的起始位置。在C语言中,可以定义一个结构体来表示节点,如头结点的创建和使用。链表操作创建链表后,可以进行增删查改操作。向链表添加元素、删除指定元素、查找数据以及更新元素都有特定的步骤和实现代码,这些...
c语言链表排序 从 if(head == NULL||head->zfzf)开始 有点看不懂 求...
\/\/首先说这是一个从大到小的排序 if(head == NULL||head->zfzf)\/\/如果是第一次输入,或者输入的总分比头还大 { s->next=head;\/\/就将s放在头的前面,最为做大 head=s;\/\/然后让head指针重新指向头部最大 } else { p=head;\/\/如果不是比头大,将p指向头指针,方便指针移动比较后,能够...
C语言 链表问题
首先头指针和尾指针都指向同一个位置:第一次执行是新分配了一个内存空间,然后赋值给尾指针,相当于把尾指针向后移动;第二次执行是往第一次和头指针内插入;第三次执行在往第二次和头指针内插入;同理 第四次执行在往第三次和头指针内插入;直到把所有学生的学号和成绩输入结束。接着,退出while...
c语言问题,不懂,请大家帮助,谢谢.
你写的也太简单了,根据经验猜测:p是一个指针,next可能表示的是p指向的下一个元素,有可能p代表的是一个链表的某个节点 如果以上猜测正确的话,p->next = h的意思是让p的下一个节点指针指向h,这样h就加入了链表 而p->next = h->next的意思是,让h的下一个节点成为p的下一个节点,如果...
c语言链表成绩管理系统 单科成绩排序 不知道怎么办 求大神解答 最好能...
1、C语言指针 指针是C语言最核心的语法之一,不会灵活使用指针,相当于没学C语言。除了C语言指针的基本用法外,二重指针和三重指针如何使用、出界和泄露如何处理等进阶问题,也应该掌握。当然,解决问题中的问题大可不必研究得那么深入,学会指针的基本用法就可以解决上述问题。2、动态内存 内存管理是系统...