您的位置:首页 > 理论基础 > 数据结构算法

数据结构实验一

2013-10-10 14:09 441 查看
#include "stdio.h"
#include "stdlib.h"
typedef struct LNode
{int data;
int num;
struct LNode *next;
}LNode,*linklist;
linklist creat(int n)
{/*构造一个长度为n的无头节点的循环链表,并返回指向最后一个节点的指针*/
linklist head,s;
int i;
s=head=(linklist)malloc(sizeof(LNode));

for(i=1;i<n;i++)
{s->data=i;
printf("num%d: ",i);
scanf("%d",&(s->num));/*输入第i个人的密码*/
while(s->num<=0)
{/*如果输入的s->num小于等于0,要求重新输入*/
printf("请重新输入\nnum%d: ",i);
scanf("%d",&s->num);
}
s->next=(linklist)malloc(sizeof(LNode));
s=s->next;
}
s->data=i;
printf("num%d: ",i);
scanf("%d",&(s->num));
s->next=head;
return(s);
}

linklist find(int m,linklist s) //找到当前元素后面第m个元素
{
int i;
for(i=0;i<m-1;i++)
s=s->next;
return(s);
}

void print(int &m,int &n,linklist &s)
{
linklist p;
s=find(m,s);
printf("%d   ",s->next->data);/*输出找到的元素*/
m=s->next->num;/*将此元素从链表中删除,并释放此节点*/
p=s->next;
s->next=s->next->next;
free(p);
--n;
}

void main()
{/*解决约舍夫问题的主函数*/
int n,m;
printf("type in n :");
scanf("%d",&n);/*输入n*/
while(n<=0)
{/*如果输入的n小于等于0,要求重新输入*/
printf("please type n in again \ntype in n :");
scanf("%d",&n);
}
printf("type in m :");
scanf("%d",&m);/*输入m*/
while(m<0)
{/*如果输入的m小于0,要求重新输入*/
printf("please type m in again \ntype in m :");
scanf("%d",&m);
}
linklist s;
s=creat(n);/*创建无头节点的循环链表,返回指向最后一个元素的指针*/
printf("the sequence is ");
print(m,n,s);//输出第一个出列的元素
while(n)
{
print(m,n,s);//输出剩余出列的元素
}
printf("\n");
}


#include "stdio.h"
#include "stdlib.h"
typedef struct LNode
{int data;int num;struct LNode *next;}LNode,*linklist;
linklist creat(int n)
{/*构造一个长度为n的无头节点的循环链表,并返回指向最后一个节点的指针*/
linklist head,s;
int i;
s=head=(linklist)malloc(sizeof(LNode));

for(i=1;i<n;i++)
{s->data=i;
printf("num%d: ",i);
scanf("%d",&(s->num));/*输入第i个人的密码*/
while(s->num<=0)
{/*如果输入的s->num小于等于0,要求重新输入*/
printf("请重新输入\nnum%d: ",i);
scanf("%d",&s->num);
}
s->next=(linklist)malloc(sizeof(LNode));
s=s->next;
}
s->data=i;
printf("num%d: ",i);
scanf("%d",&(s->num));
s->next=head;
return(s);
}
void main()
{/*解决约舍夫问题的主函数*/
int n,m;
printf("type in n :");
scanf("%d",&n);/*输入n*/
while(n<=0)
{/*如果输入的n小于等于0,要求重新输入*/
printf("please type n in again \ntype in n :");
scanf("%d",&n);
}
printf("type in m :");
scanf("%d",&m);/*输入m*/
while(m<0)
{/*如果输入的m小于0,要求重新输入*/
printf("please type m in again \ntype in m :");
scanf("%d",&m);
}
linklist s,p;
s=creat(n);/*创建无头节点的循环链表,返回指向最后一个元素的指针*/
printf("the sequence is ");
int i;
for(i=0;i<m-1;i++)/*找到第一个输出的元素,输出此元素*/
s=s->next;
printf("%d   ",s->next->data);
m=s->next->num;/*将此元素从链表中删除,并释放此节点*/
p=s->next;
s->next=s->next->next;
free(p);
--n;
while(n)
{for(i=0;i<m-1;i++)/*找到第(i+1)个输出的元素,输出此元素*/
s=s->next;
printf("%d   ",s->next->data);
m=s->next->num;/*将此元素从链表中删除,并释放此节点*/
p=s->next;
s->next=s->next->next;
free(p);
--n;
}
printf("\n");
}


// *
双向链表的建立
*/
// * ======================================== */
#include <stdlib.h>
struct dlist
// * 双向串列结构宣告
*/
{
int data;
// * 节点资料
*/
struct dlist *front;
// * 指向下一节点的指标 */
struct dlist *back;
// * 指向前一节点的指标 */
};
typedef struct dlist dnode;
// * 双向串列新型态
*/
typedef dnode *dlink;
// * 双向串列指标新型态 */
// * ---------------------------------------- */
// *
使用阵列值建立双向链结串列
*/
// * ---------------------------------------- */
dlink createdlist(int *array,int len)
{
dlink head;
// * 双向串列的指标
*/
dlink before;
// * 前一节点的指标
*/
dlink new_node;
// * 新节点的指标
*/
int i;
// * 建立第一个节点 */
// * 配置节点记忆体 */
head = ( dlink ) malloc(sizeof(dnode));
if ( !head )
// * 检查记忆体指标
*/
return NULL;
head->data = array[0];
// * 建立节点内容
*/
head->front = NULL;
// * 设定指标初值
*/
head->back = NULL;
// * 设定指标初值
*/
before = head;
// * 指向第一个节点
*/
for ( i = 1; i < len; i++ )
// * 用回路建立其它节点 */
{
// * 配置节点记忆体 */
new_node = ( dlink ) malloc(sizeof(dnode));
if ( !new_node )
// * 检查记忆体指标
*/
return NULL;
new_node->data = array[i];
new_node->front = NULL;
// * 设定指标初值
*/
new_node->back = before;
// * 将新节点指向前节点 */
before->front = new_node;
// * 将前节点指向新节点 */
before = new_node;
// * 新节点成为前节点
*/
}
return head;
// * 传回串列起始指标
*/
}
// * ---------------------------------------- */
// *
双向链结串列的列印
*/
// * ---------------------------------------- */
void printdlist(dlink head,dlink now)
{
while ( head != NULL )
// * 串列走访回路
*/
{
if ( head == now )
// * 印出目前节点资料
*/
printf("#%d#",head->data);
// * 列印节点资料
*/
else
printf("[%d]",head->data);
// * 列印节点资料
*/
head = head->front;
// * 指向下一个节点
*/
}
printf("\n");
// * 换行
*/
}
// * ---------------------------------------- */
// *
主程式: 模拟双向串列的移动
*/
// *
使用选项来移动节点, 且将值和节点编号印
*/
// *
出.
*/
// * ---------------------------------------- */
void main()
{
dlink head;
// * 双向链结串列指标
*/
dlink now = NULL;
// * 目前节点指标
*/
int list[6] = { 1, 2, 3, 4, 5, 6 };
// * 阵列内容
*/
int select;
// * 选择项1,2或3
*/
head = createdlist(list,6);
// * 建立双向链结串列
*/
if ( head == NULL )
{
printf("记忆体配置失败! \n");
// * 串列建立失败 */
exit(1);
// * 结束程式
*/
}
now = head;
// * 目前指向第一节点
*/
while ( 1 )
{
printf("链表内容是: ");
printdlist(head,now);
// * 列印出内容
*/
printf("[1]往下移动 [2]往回移动 [3]离开 ==> ");
scanf("%d",&select);
// * 读入选项
*/
switch ( select )
{
// * 往下移动 */
case 1: if ( now->front != NULL )
now = now->front;
// * 指向下一节点 */
break;
// * 往回移动 */
case 2: if ( now->back != NULL )
now = now->back;
// * 指向前一节点 */
break;
// * 离开 */
case 3: exit(1);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: