1、带头结点的双链表l,每个节点有4个数据成员,前驱节点llink,后继节点rlink,数据成员data,访问频度freq,且已知双向链表L中节点一直按访问频度递减的顺序排列且频繁访问的节点一直靠近表头,初始状态l中的所有节点freq的节点都为0,对双链表的locate操作,每操作一次,将数据值x的节点访问频度+1,设计一个算法,对双链表l的locate操作,要求操作后L中的节点仍然按照频度的递减顺序排列
思路:
先找到结点值为x的节点,频度加1,然后断链
然后找到需要插入的节点,分情况讨论
代码:
typedef struct dnode{int data;int freq;struct dnode *llink, *rlink;
}*dlist; void locate(dlist head, int x){dlist p = head->rlink,q;while(p != NULL && p->data != x) p = p->rlink; //找到节点值为x的节点 //访问频度加1if(p!=NULL){ //找到节点 p->freq++; //频度加1 if(p->llink == head) return; //第一个节点,不用调整 q = p; //保存需要操作的节点p->llink->rlink = p->rlink; //断开p左右节点的链并接上 if(p->rlink!=NULL) //右链得保证存在才能接 p->rlink->llink = p->llink; p = q->llink; //从q的前一个结点找到q的freq大的节点 while(p != head && p->freq < q->freq) p = p->llink; //找到需要插入的节点 if(p->rlink==NULL){ //q插到p节点前 ,注意这里的插法q->llink = p;q->rlink = p->rlink; p->rlink = q;}else{ //不是插到最后一个节点 p->rlink->llink = q;q->llink = p; q->rlink = p->rlink;p->rlink = q;}} p = head->rlink;while(p){printf("%d %d\n",p->data,p->freq);p = p->rlink;}
}
1、设计字符串S以及长度为n的字符型一维数组a,编写一个函数,统计a中每个字符在字符串S中出现的次数,要求该函数以s,a,n为形参,一维整型数组为返回值
思路:
代码:
//思路:先统计S中每个字符出现的次数,然后再遍历a,通过hash表反应a中每个字符在s中出现的次数
int *count(char *s, char a[], int n){int *hash = (int *)malloc(sizeof(int)*255); //C语言中char类型默认是有符号类型,字符串的ASCII码范围是0-255int *result = (int *)malloc(sizeof(int)*n); //保存结果 memset(hash,0,sizeof(int)*255); //初始化赋值 int i = 0;while(s[i]!='\0'){hash[s[i++]]++;}for(i=0; i < n; i++){printf("%c在S中出现的次数为%d\n",a[i],hash[a[i]]);result[i] = hash[a[i]]; }return result;
}
2、m行n列矩阵,编写程序将矩阵中值小于0的元所在行与列上的所有元素置为0,并输出
思路:
代码:
//思路:不能直接赋值为0,得先把0放到第一行或者第一列,然后还需要两个变量来保存第一行或者第一列来保存最开始的结果void outQuadrix(int a[][N], int m, int n){int row = 0, col = 0; //判断第一行或者第一列是否为0的标志 for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){if(a[i][j]<=0){if(i==0){row = 1;}if(j==0){col = 1;}a[0][j]=0; //第一行的第j列置为0 a[i][0]=0; //第一列的第i行置为0 }}}for(int i = 1; i < m; i++){for(int j = 1; j < n; j++){if(a[i][0]==0 || a[0][j]==0){ //如果该行或者该列存在0,则该行或者该列的元素全部置为0 a[i][j] = 0;}}} if(col){for(int i = 0; i < m; i++)a[i][0] = 0;}if(row){for(int i=0; i < n; i++){a[0][i] = 0;}}for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){printf("%-4d",a[i][j]);}printf("\n");}
}