数据结构 |
您所在的位置:网站首页 › 树形结构的应用举例 › 数据结构 |
线性表的应用举例
引言
应用举例应用一:多项式的处理应用二:Joseph问题(约瑟夫算法)joseph代码思路构建:joseph代码完整示例:
引言
我们前面学习了线性表的顺序存储,顺序表的链式存储,但是在实际运用过程中我们该如何应用呢? 多项式表示 与 相加: 设一元n次多项式:![]() ![]() ![]() 对应的线性表就是P(1,0,……,0,3,……,2). 显然这些0元素在存储结构中要占用大量的存储空间,是一种浪费,且处理起来费时,所以去掉Pn(x)中系数为0的项,写作: 例如 设两多项式A,B分别为: C为A,B多项式的合并![]() A和B的链表结构如图: 结果链表图为 Joseph问题: 设编号分别为:1,2,…,n的n个人围坐一圈。约定序号为 k (1 ≤ k ≤ n)的人, 从1开始计数,数到m的那个人出列,他的下一位又从1开始计数,数到m的那个人又出列,依次类推,直到所有人出列为止。 例2-9设n=8,k=3,m=4时,如图所示。 算法思路: 用一个不带头结点的循环链表来处理Josephu问题: 先构想结构体的定义建立一个有n个结点的(无头结点)单循环链表验证链表的正确性:遍历链表,然后从第k结点起从1计数,计到m时,对应结点从链表中删除;然后再从被删除结点的下一个结点起又从1开始计数……,直到所有结点都出列时算法结束。算法对应的链表结构如图所示。 joseph代码思路构建: 单项循环链表的建立 第一步:先构想结构体的定义 #ifndef _JOSEPH_H__ #define _JOSEPH_H__ #include #include typedef struct node{ int data; struct node *next; }listnode, *linklist; extern linklist list_create(); extern void list_show(linklist H); #endif
第二步:建立一个有n个结点的(无头结点)单循环链表,并且验证链表的正确性:遍历链表, #include"joseph.h" int main() { linklist H; H=list_create(); list_show(H); return 0; }
首先我们要知道joseph算法,规则是序号为k的人从1开始计数,数到m那个人出列,他的下一位在从1开始数,所有人出列为止。 比如从3号开始数,到6号时候数到了4,故6号出列,6号出列(6号结点从循环链表里删除)要找到他前一个结点,我们看图 //尾指针r要指向k(开始数数的人)的前一个结点上 void list_jose(linklist H , int k ,int m){ linklist r; r=H; //指针r 开始时 指向 第一个节点上 //判断r指向的下一个结点的值是不是k(开始数数的人) //若不是,r向下移动 在进行判断下一个结点 while(r->next->data != k){ r = r->next; } printf("k= %d\n",k); }从 r 指向3号(开始数的人)的前一个结点(2号)了,3号开始数,到6号时候数到了4,故6号出列,6号出列(6号结点从循环链表里删除)要找到他前一个结点 ,这时候 r 指针移动3次 (m-1次) 指向要被删除结点的前一个结点 k=3,m=4 文件二:joseph.c #include"joseph.h" //循环单链表创建 linklist list_create(){ linklist H,r,p; int n; int i; loop: puts("please input n"); scanf("%d",&n); if(n puts("maloc failed"); return NULL; } H->data = 1; H->next = H; r = H; for(i =2 ; i puts("maloc failed"); return NULL; } p->data = i; r->next = p; r = p; } p->next =H; return H; } //遍历循环单链表 void list_show(linklist H){ linklist p = H; while(p->next != H){ printf("%d ",p->data); p = p->next; } printf("%d",p->data); puts(""); } //joseph规则删除结点 void list_jose(linklist H , int k ,int m){ int i; linklist r,p; r=H; while(r->next->data != k){ r = r->next; } printf("k= %d\n",k); while(r->next != r){ for(i=0 ; i linklist H; int k=1; int m=1; H = list_create(); list_show(H); list_jose(H,k,m); return 0; }-----------------------------------------很棒学习完了数据结构的 线性表的应用举例-------------------------------------------------- --------------------------------------------------------[下期预告:栈]------------------------------------------------------ |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |