链表中递归查找元素,非递归查找元素 以及基数排序(未完成)josephus问题(未完成)
2014-03-26 22:45
417 查看
#ifndef CIRCLECHAIN_H #define CIRCLECHAIN_H struct NODE; struct LIST; typedef NODE* node; typedef LIST* list; typedef int elemtype; //单链表 struct NODE { int n; node next; }; struct LIST { node tail; node header; }; //初始化链 list creatList(); //在末尾添加一个节点添加成功返回1,添加失败返回0 int addNode(elemtype n,list l); //打印链表所有元素 void printlist(list l); //判断是否为最后一个链表 bool isLast(node n,list l); #endif
具体实现 #include "circlechain.h" #include "stdlib.h" #include "stdio.h" list creatList() { list l=(list)malloc(sizeof(list)); node n; n=(node)malloc(sizeof(node)); n->next=NULL; l->header=l->tail=n; return l; } int addNode(elemtype n,list l) { node nod=(node)malloc(sizeof(node)); nod->n=n; nod->next=l->header->next; l->tail->next=nod; l->tail=nod; return 1; } void printlist(list l) { node p=l->header->next; do{ printf("\n%d",p->n); p=p->next; } while (p!=l->header->next) ; } //注这里是删除NODE下一个节点 void delNextNode(node n,list l) { //如果是最后一个元素 就需要考虑到链表头的指向 if (isLast(n,l)) { node tmp=n->next; n->next=tmp->next; //把头结点指向新的元素 l->header->next=n->next; free(tmp); } else { node tmp=n->next; n->next=tmp->next; free(tmp); } } //判断是否为最后一个元素 bool isLast(node n,list l) { if (n->next==l->header->next) { return true; } return false; } //JOsephus问题 还未解决这个问题,调用会报错 void Josephus(int M,int N) { list l=creatList(); for(int i=1;i<=N;i++) { addNode(i,l); } //开始转圈删除 while (l->header->next!=NULL) { node p=l->header; for(int i=0;i<M;i++) { p=p->next; } printf("%d ",p->n); delNextNode(p,l); } } //非递归查找特定元素 node find(int x,list l) { node p=l->header->next; do{ if (p->n=x) { return p; } p=p->next; } while (p!=l->header->next) ; return NULL; } //递归查找特定元素实现 node deguiFind(int x,node p,list l) { if(x==p->n) { return p; } else if(p==l->tail) { return NULL; } else { return deguiFind(x,p->next,l); } } //非递归翻转单链表 void reverse(list l) { } //基数排序 void sort(int *n) { list l[10]; //初始化每一个表 for(int i=0;i<10;i++) { l[i]=creatList(); } //按照各位优先排序 这里需要提前知道应该分为多少趟 for(int j=0;j<3;j++) { //从最低位到最高位提取数据 while (n) { addNode(n,l[n%10]); } } } int main() { list l=creatList(); for(int i=1;i<=10000;i++) { addNode(i,l); } ////////////////////////////////////////////////////////////////////////// //查找测试 node p=l->header->next; node fdp=deguiFind(6,p,l); if (fdp==NULL) { printf("没有找到"); } else { printf("%d",fdp->n); } ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// //基数排序 sort(); getchar(); return 0; }
相关文章推荐
- 关于动态存储分配函数的调用,在已经过排序的数组中查找及删除内容的操作,余数的分析,删除字符数组中的空格,对链表的逆置,在源字符串中查找子字符串的个数,函数指针以及函数的调用,循环赋值带来的问题以及插入
- java实现单向链表CRUD,反转,排序,查找倒数第k个元素,递归输出等操作
- 根据原生JS封装函数,根据传递的选择器查找对应的元素以及解决getElementsByClassName() 兼容问题
- 链表倒K元素查找问题
- 递归的定义以及递归的示例(计算阶乘、计算斐波那契数、递归二分查找、回文串递归方法解决、汉诺塔问题、递归选择排序问题)
- 分治法对最大连续和以及归并排序,分治与递归实质把问题区间区域分割成几个小区间或者小分区,一直下钻到一个元素小区解决问题
- 链表中间元素查找问题
- 【Weiss】【第03章】练习3.11:比较单链表递归与非递归查找元素
- 《数据结构与算法——C语言描述》答案 3.11 查找单链表中的特定元素(递归)
- 《数据结构与算法——C语言描述》答案 3.11 查找单链表中的特定元素(非递归)
- c语言:【顺序表】静态顺序表的在指定位置插入元素,以及查找指定元素
- 二分法的应用----------利用随机类生成数组,并用二分法对数组的元素进行查找以及插入操作
- jQuery父级以及同级元素查找
- 逆位序正位序建表以及插入和删除值以及返回链表中元素个数
- 面试题之链表问题 - 找出倒数第k个元素(或中间元素)
- Josephus问题递归解法
- 每日一题14:数组与链表组合方案下的Josephus问题
- Android过渡动画之共享元素实现以及遇到的一些问题
- P问题、NP问题以及NP难问题的相关信息查找结果
- 二分查找(Binary Search)需要注意的问题,以及在数据库内核中的实现