数据结构-线性相关代码

来源:互联网 发布:外国人的审美 知乎 编辑:程序博客网 时间:2024/04/29 22:58

1.汉诺塔-递归问题

int i=1;//记录步数  void move(int n,char from,char to) {printf("第%d步:将%d号盘子%c---->%c\n",i++,n,from,to);  }  void hanoi(int n,char from,char denpend_on,char to) {      if (n==1)      move(1,from,to);//只有一个盘子是直接将初塔上的盘子移动到目的地      else {        hanoi(n-1,from,to,denpend_on);       move(n,from,to);                  hanoi(n-1,denpend_on,from,to);}


2.已知一个不带表头节点的单链表中每个节点存放一个整数,并且节点数不少于2。设计一个算法,判断该链表中从第2个节点开始(包含第2个节点)的每个元素值是否等于其序号的平方减去其前驱结点的值,满足则返回true,否则返回false。
bool judge(LinkList head){LNode *q=head;LNode *p=head->next;int num=2;while(p){if(p->data!=num*num*q->data)return false;q=p;p=p->next;}return true;}

3.假定数组A[0,…,n-1]中有多个零元素,试写一个函数,将A中所有的非零元素依次移到数组A的前端,要求空间复杂度为O(1)。

void MoveNumZeroLeft(int A[],int n){int i=0,j=n-1;while(i<j){while(A[i]!=0&&i<j)i++;while(A[j]==0&&i<j) j--;if(i<j)Swap(A[i],A[j]);}}


4.已知一个带头节点的单链表,设该链表只给出了头指针head。在不改变链表结构的前提下,设计一个尽可能高效的算法,查找链表中倒数第K个位置上的节点。若查找成功,则返回该节点中元素值,否则返回-1。(只能通过一次遍历)。

LNode * FindKthToTail(LinkList L,int k){LNode *p=L->head;LNode *q=NULL;for(int i=0;i<k-1;i++)p=p->next;q=L->head;while(q->next){p=p->next;q=q->next;}return q;}

5.将n(n>1)个整数存放到一维数组R中,试设计一个在时间和空间上尽可能高效的算法,将R中保存的序列循环左移p(0<p<n)个位置,即将R中的数据由(X0,X1,…,Xn-1)变换成为(Xp,Xp+1,…,X0,X1,…,Xp-1)。

void Converse(int R[],int n,int p){//R为数组,n为长度,p为要左循环多少个Reverse(R,0,p-1);Reverse(R,p,n-1);Reverse(R,0,n-1);}void Reverse(int R[],int from,int to){for(int i=0;i<(to-from+1)/2;i++)Swap(R[from+i],R[to-i]);}


6.编写一个算法,将一个非负的十进制数N转换为一个二进制数。

void DecToBin(int N){int i;Stack S;while(N!=0){i=N%2;N=N/2;Push(S,i);}while(IsEmpty(S))printf(“%d”,Pop(S));}




原创粉丝点击