单链表形式存储的线性表,每个表均按元素值递增次序进行排序,编写算法,将两个单链表合并为一个递减次序的单链表 ,要求不能额外增加存储空间
思路:
代码:
typedef struct node{int data;struct node *next;
}*list; list mergelist(list head1, list head2){ //假设不带头结点 struct node *newhead,*p1,*p2,*next; //newhead保存合并的单链表,p1为head1的工作指针,p2为head2的工作指针 p1 = head1; p2 = head2;if(p1->data > p2->data){ //保存较小的节点 newhead = p2;p2 = p2->next;}else{newhead = p1;p1 = p1->next;} newhead->next = NULL;while(p1 != NULL && p2 != NULL){if(p1->data > p2->data){ //将较小的节点头插入newhead中 next = p2->next;p2->next = newhead;newhead = p2;p2 = next;}else{next = p1->next;p1->next = newhead;newhead = p1;p1 = next;} }while(p1){ //p1还有节点,继续插入 next = p1->next;p1->next = newhead;newhead = p1;p1 = next;}while(p2){ //p2还有节点,继续插入 next = p2->next;p2->next = newhead;newhead = p2;p2 = next;} p1 = newhead;while(p1!=NULL){printf("%d ",p1->data);p1 = p1->next;}return newhead;
}
已知图中两个顶点,设计一个算法求出顶点i到顶点j的所有简单路径
思路:
代码:
typedef struct ArcNode{ //边结点 int adjvex;struct ArcNode *next;
}ArcNode; typedef struct VNode{ //顶点节点 int data;struct ArcNode *firstarc;
}VNode;typedef struct AGraph{ //领接表 VNode adjlist[maxsize];int vexnum, edgenum;
}AGraph;//思路:深度优先遍历回溯
int visited[maxsize] = {0};
int path[maxsize] = {0};void dfsfindall(AGraph *G, int i, int j, int count){ //count统计路径长度 path[count++] = i; visited[i] = 1;if(i == j){for(int k = 0; k < count; k++){printf("经过了节点%d ",path[k]);}printf("\n"); }ArcNode *p = G->adjlist[i].firstarc;while(p!=NULL){if(visited[p->adjvex] == 0){dfsfindall(G,p->adjvex,j,count);} p = p->next;}visited[i] = 0; //回溯
}
一个长度为n的非负整型双向队列的加权和定义如下:
(1)依次从队列头或者队列尾取一个数,共取n次
(2)第i次取出的数乘以系数i,得到加权数
(3)将n个加权数求和,即为该队列的加权和
编写函数,计算给定一个长度为n的非负整型双向队列的“加权和"的最大值
双向队列用一维数组或链表表示
思路:
代码:
//贪心思路:比较队头和队尾元素大小,将小的先出队
int summary(int A[], int n){int i=0, j = n-1,sum=0,count = 1;while(i <= j){if(A[i] < A[j]){sum += A[i]*count;i++;}else{sum += A[j]*count;j--;}count++;} printf("最大加权和为%d",sum);return sum;
}
N*N的矩阵a表示有向图的领接表,其中
d[i,j] = 1 节点i到节点j有边
d[i,j] = 0 节点i到节点j无边
编写函数,给定节点i和步长k,计算节点i经k步能到达的所有节点
思路:
代码:
int visited[N] = {0}; //判断是否访问过
int isout[N] = {0}; //判断是否输出 void dfsfindallnode(int a[N][N], int i, int k){if(k == 0){ //函数的终止条件 if(isout[i] == 0){printf("可以到达节点%d\n",i); isout[i] = 1;return; //结束当前层递归 }}for(int j = 0; j < N; j++){if(a[i][j] == 1 && visited[j]==0){//如果可以到达这个点的话 visited[j]=1;dfsfindallnode(a,j,k-1);visited[j]=0; 斜体样式 //回溯还原 }}
}
上一篇:关心下一代工作有什么重要意义