《数据结构与算法》实验指导V2017
(5)创建链表:
(6)销毁和退出链表:
常熟理工学院计算机科学与工程学院
16
《数据结构与算法》实验指导V2017
3循环链表的应用(约瑟夫回环问题、)
用整数序列1,2,3,…,n表示顺序坐在圆桌周围的人,并采用循环链表作为存储结构。任意位置k开始计数,计到m让此位置的人出局,重复上述过程,直至只剩下最后一个人。依次输出每个出局的人的序号。
提示:用一个无头结点的循环单链表来实现n个元素的存储。exp2_3.c部分代码如下: #include
typedef int ElemType; /*定义表元素的类型*/ typedef struct LNode /*线性表的单链表存储*/ {
ElemType data;
struct LNode *next; } LNode,*LinkList;
/*(1)---创建具有n个结点的无头结点的单向循环链表,返回其头指针*/ LinkList CreateList(int n) {
LinkList L;
L=(LinkList )malloc(sizeof(LinkList)); LNode *q,*p;
printf(\输入元素:\\n\ scanf(\
常熟理工学院计算机科学与工程学院
17
《数据结构与算法》实验指导V2017 q=L; int a;
for(a=0;a p=(LNode *)malloc(sizeof(LNode)); scanf(\ q->next=p; q=p; } q->next=L; return L; }/*CreateList*/ /*(2)---输出无头结点循环单链表的所有元素*/ void PrintList(LinkList L) { printf(\输出表中的元素:\ LNode *p; printf(\ p=L->next; while(p!=L){ printf(\ p=p->next; } }/*PrintList*/ /*(3)---约瑟夫问题计算,依次输出出局的元素的序号*/ void JOSEPHUS(int n,int k,int m,LinkList L) { L=CreateList(n); PrintList(L); int a,length=n; LNode *q; for(a=1;a L->next=q->next; printf(\被删除的数字:%d\\n\ free(q); length-=1; } 常熟理工学院计算机科学与工程学院 18 《数据结构与算法》实验指导V2017 printf(\输出最终的一个数字:%d\}/*JOSEPHUS*/ int main() { int n,m,k; LinkList L=NULL; /*定义指向单链表的指针*/ printf(\输入元素的个数\ printf(\输入位置\ printf(\输入人数\ while(scanf(\个元素从k位置开始每m个报数*/ JOSEPHUS(n,k,m,L); return 0; } .输入10 2 3,表示一共有10个数,从第2个数之后开始数,数到3的人出局 实验结果: 常熟理工学院计算机科学与工程学院 19 《数据结构与算法》实验指导V2017 4、选做实验:设有头单链表,设计算法将表中值相同的元素仅保留一个结点。 提示:指针p从链表的第一个元素开始,利用指针q从指针p位置开始向后搜索整个链表,删除与之值相同的元素;指针p继续指向下一个元素,开始下一轮的删除,直至p==null为至,既完成了对整个链表元素的删除相同值。 #include typedef int ElemType; typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; LinkList L=NULL; LNode *InitList(LinkList L); void PrintList(LinkList L); void DestroyLinkList(LinkList L); LinkList CreateList(int n); /*带头结点单链表初始化*/ LNode *InitList(LinkList L) { L=(LNode *)malloc(sizeof(LNode)); if (!L) return ERROR; L->next=NULL; return L; } /*输出带头结点单链表的所有元素 */ void PrintList(LinkList L) { LinkList p; p=L->next; int i=1; while(p) { printf(\ p=p->next; } printf(\}/*PrintList*/ 常熟理工学院计算机科学与工程学院 20