C语言的循环链表和约瑟夫环
约瑟夫问题)是一个数学的应用问题,对于学习C语言四非常挺有帮助的,下面是小编为大家搜集整理出来的有关于C语言的循环链表和约瑟夫环,一起了解下吧!
循环链表的实现单链表只有向后结点,当单链表的尾链表不指向NULL,而是指向头结点时候,形成了一个环,成为单循环链表,简称循环链表。当它是空表,向后结点就只想了自己,这也是它与单链表的主要差异,判断node->next是否等于head。
代码实现分为四部分:
1. 初始化
2. 插入
3. 删除
4. 定位寻找
代码实现:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 | void ListInit(Node *pNode){
int item;
Node *temp,*target;
cout<< "输入0完成初始化" <<endl; cin= "" >>item;
if (!item)
return ;
if (!(pNode)){ //当空表的时候,head==NULL
pNode = new Node ;
if (!(pNode))
exit( 0 ); //未成功申请
pNode->data = item;
pNode->next = pNode;
}
else {
//
for (target = pNode;target->next!=pNode;target = target->next)
;
temp = new Node;
if (!(temp))
exit( 0 );
temp->data = item;
temp->next = pNode;
target->next = temp;
}
} } void ListInsert(Node *pNode, int i){ //参数是首节点和插入位置
Node *temp;
Node *target;
int item;
cout<< "输入您要插入的值:" <<endl; cin= "" >>item;
if (i== 1 ){
temp = new Node;
if (!temp)
exit( 0 );
temp->data = item;
for (target=pNode;target->next != pNode;target = target->next)
;
temp->next = pNode;
target->next = temp;
pNode = temp;
}
else {
target = pNode;
for ( int j= 1 ;j<i- 1 ;++j) target= "target-" >next;
temp = new Node;
if (!temp)
exit( 0 );
temp->data = item;
temp->next = target->next;
target->next = temp;
} } void ListDelete(Node *pNode, int i){
Node *target,*temp;
if (i== 1 ){
for (target=pNode;target->next!=pNode;target=target->next)
;
temp = pNode; //保存一下要删除的首节点 ,一会便于释放
pNode = pNode->next;
target->next = pNode;
temp;
}
else {
target = pNode;
for ( int j= 1 ;j<i- 1 ;++j) target= "target-" >next;
temp = target->next; //要释放的node
target->next = target->next->next;
temp;
} } int ListSearch(Node *pNode, int elem){ //查询并返回结点所在的位置
Node *target;
int i= 1 ;
for (target = pNode;target->data!=elem && target->next!= pNode;++i)
target = target->next;
if (target->next == pNode && target->data!=elem)
return 0 ;
else return i; }</i- 1 ;++j)></i- 1 ;++j)></endl;></endl;> |
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的`那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。这类问题用循环列表的思想刚好能解决。
注意:编写代码的时候,注意报数为m = 1的时候特殊情况
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 | #include<iostream> #include<cstdio> using namespace std; typedef struct Node{
int data;
Node *next; }; Node *Create( int n){
Node *p = NULL, *head;
head = new Node;
if (!head)
exit( 0 );
p = head; // p是当前指针
int item= 1 ;
if (n){
int i= 1 ;
Node *temp;
while (i<=n){
temp = new Node;
if (!temp)
exit( 0 );
temp->data = i++;
p->next = temp;
p = temp;
}
p->next = head->next;
}
head;
return p->next; } void Joseph( int n, int m){
//n为总人数,m为数到第m个的退出
m = n%m;
Node *start = Create(n);
if (m){ //如果取余数后的m!=0,说明 m!=1
while (start->next!=start){
Node *temp = new Node;
if (!temp)
exit( 0 );
for ( int i= 0 ;i<m- 1 ;i++) 1 = "" m= "3%2" start= "start-" >next;
temp = start->next;
start->next = start->next->next;
start = start->next;
cout<<temp->data<< " " ;
temp;
}
}
else {
for ( int i= 0 ;i<n- 1 ;i++){ node= "" start-= "" temp= "new" >data<< " " ;
temp = start;
start = start->next;
temp;
}
}
cout<<endl; last= "" person= "" start-= "" the= "" >data<<endl; int = "" pre= "" return = "" >
</endl;></endl;></n- 1 ;i++){></temp-></m- 1 ;i++)></cstdio></iostream> |
-
C语言中gets()函数知识
导语:gets从标准输入设备读字符串函数,其可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。。下面是C语言中gets()函数知识,一起来学习下吧:gets()函数用于从缓冲区中读取字符串,其原型如下:char*gets(cha...
-
C与C++之间相互调用的实例方法
如果使用C语言编写的DLL,希望从中导出函数给C或C++的模块访问,则应使用__cplusplus预处理器宏确定正在编译的语言。如果是从C++语言模块使用,则用C链接声明这些函数。如果使用此技术并为DLL提供头文件,则这些函数可以原封不动地由C和C++模块使用。下面是小编为大家...
-
浅谈高职C语言课程的教学分析与设计
C语言作为学院网络技术专业的人门课程,旨在通过锻炼学生的逻辑思维,墙养学生在职业岗位中实际应用的能力.目前,该专业的学生毕业后主要从事网站开发和网络管理等方面的工作,而在这些领域几乎都以C语言作为应用的开发工具.但从历年教学实践来看,教师往往付出的精力多...
-
C语言的第一个程序
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的`编程语言。下面小编带大家看看第一个C语言程序。第一个C语言程序实例说明输出"Hello,world!"是...