主题:[原创]编程高手来帮帮忙
snailmiss
[专家分:0] 发布于 2008-02-26 08:53:00
[b][size=6][size=1][size=4]图的遍历和生成树求解实现要求:
1) 先任意创建一个图;
2) 图的DFS,BFS的递归和非递归算法的实现
3) 最小生成树(两个算法)的实现,求连通分量的实现
4) 要求用邻接矩阵、邻接表、十字链表多种结构存储实现[/size][/size][/size][/b]这有个范例
回复列表 (共4个回复)
沙发
snailmiss [专家分:0] 发布于 2008-02-26 08:55:00
课程设计报告范例
约瑟夫环问题。
问题描述:设编号为1,2,…,n(n>0)个人按顺时针方向围坐一圈,每人持有一个正整数密码。开始时任意给出一个报数上限值m,从第一个人开始顺时针方向自1起顺序报数,报到m时停止报数,抱m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人起重新自1起顺序报数;如此下去,直到所有人全部出列为止。要求设计一个程序模拟此过程,并给出出列人的编号序列。
基本要求:
(1)初始报数上限值m和测试数据在程序中确定;
(2)用带头结点的单循环链表作数据元素的存储结构;
(3)把带头结点的单循环链表作为抽象数据类型设计。
测试数据:
n = 7,七个人的密码依次为3,1,7,2,4,8,4
初始报数上限值m = 20
算法思想:
JesephRing()函数是实现问题要求的主要函数,其算法思想是:从1至m对带头结点的单循环链表循环计数,到m时,输出该结点的编号值,将该结点的密码作为新的m值,再从该结点的下一个结点起重新自1起循环计数;如此下去,直到单循环链表空时循环过程结束。
模块划分:
(1)带头结点的单循环链表抽象数据类型SCLinList,其中包括基本操作的函数有:初始化操作函数、插入一个结点操作函数、删除一个结点操作函数、取一个结点数据操作函数和判表是否非空操作函数。该抽象数据类型文件名为SCLinList.h。
(2)void SCLLDeleteAfter(SCLNode *p),其功能是删除带头结点的单循环链表中指针p所指结点的下一个结点。这是对带头结点的单循环链表抽象数据类型SCLinList,补充本问题需要的一个操作函数。
(3)void JesephRing(SCLNode *head, int m),其功能是对带头结点的单循环链表head,以m为初始报数上限值实现问题要求。
(4)void main(void),主函数,功能是给出测试数据值,建立测试数据值的带头结点单循环链表,调用JesephRing()函数实现问题要求。
数据结构:
(1)数据类型DataType定义如下:
typedef struct
{
int number;
int cipher;
} DataType;
(2)带头结点单循环链表抽象数据类型SCLinList。
(3)带头结点单循环链表抽象数据类型的结点结构定义如下:
typedef struct node
{
DataType data;
struct node *next;
} SCLNode;
源程序:
源程序存放在两个文件中,文件SCLinList.h是带头结点单循环链表抽象数据类型,文件Exam3-9.c是主程序。
文件SCLinList.h:
typedef struct node
{
DataType data;
struct node *next;
} SCLNode; /*结点结构定义*/
void SCLLInitiate(SCLNode **head) /*初始化*/
{
if((*head = (SCLNode *)malloc(sizeof(SCLNode))) == NULL) exit(1);
(*head)->next = *head;
}
int SCLLInsert(SCLNode *head, int i, DataType x) /*插入一个结点*/
{
SCLNode *p, *q;
int j;
p = head->next; j = 1;
while(p != head && j < i - 1)
{
p = p->next; j++;
}
if(j != i - 1 && i != 1)
{
printf("插入位置参数错!");
return 0;
}
if((q = (SCLNode *)malloc(sizeof(SCLNode))) == NULL) exit(1);
q->data = x;
q->next = p->next;
p->next = q;
return 1;
}
int SCLLDelete(SCLNode *head, int i, DataType *x) /*删除一个结点*/
{
SCLNode *p, *q;
int j;
p = head; j = 0;
while(p->next != head && j < i - 1)
{
p = p->next; j++;
}
if(j != i - 1)
{
printf("删除位置参数错!");
return 0;
}
q = p->next;
p->next = p->next->next;
*x = q->data;
free(q);
return 1;
}
int SCLLGet(SCLNode *head, int i, DataType *x) /*取一个结点数据元素值*/
{
SCLNode *p;
int j;
p = head; j = 0;
while(p->next != head && j < i)
{
p = p->next; j++;
}
if(j != i)
{
printf("取元素位置参数错!");
return 0;
}
*x = p->data;
return 1;
}
int SCLLNotEmpty(SCLNode *head) /*链表非空否*/
{
if(head->next == head) return 0;
else return 1;
}
文件Exam3-9.c:
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int number;
int cipher;
} DataType; /*定义具体的数据类型DataType*/
#include "SCLinList.h" /*包含SCLinList抽象数据类型*/
void SCLLDeleteAfter(SCLNode *p) /*删除p指针所指结点的下一个结点*/
{
SCLNode *q = p->next;
p->next = p->next->next;
free(q);
}
void JesephRing(SCLNode *head, int m)
/*对带头结点单循环链表head,初始值为m的约瑟夫环问题函数*/
{
SCLNode *pre, *curr;
int i;
pre = head;
curr = head->next;
while(SCLLNotEmpty(head) == 1)
{
for(i = 1; i < m; i++)
{
pre = curr;
curr = curr->next;
if(curr == head)
{
pre = curr;
curr = curr->next;
}
}
printf(" %d ", curr->data.number);
m = curr->data.cipher;
curr = curr->next;
if(curr == head) curr = curr->next;
SCLLDeleteAfter(pre);
}
}
void main(void)
{
DataType test[7]={{1,3},{2,1},{3,7},{4,2},{5,4},{6,8},{7,4}};
int n = 7, m = 20, i;
SCLNode *head;
SCLLInitiate(&head); /*初始化*/
for(i = 1; i <= n; i++) /*循环插入建立单循环链表链表*/
SCLLInsert(head, i, test[i-1]);
JesephRing(head, m); /*约瑟夫环问题函数*/
}
测试情况:
程序输出为:
6 1 4 7 2 3 5
板凳
snailmiss [专家分:0] 发布于 2008-02-26 09:01:00
星期5之前要用啊 各位大哥快帮帮忙啊
3 楼
mogorth [专家分:0] 发布于 2008-09-10 15:43:00
刚好用到例题
4 楼
lonmaor [专家分:1220] 发布于 2008-09-11 11:12:00
貌似坛子里有人专门代做课程设计的
我来回复