① Huffman編碼c語言實現
說明:本程序是依據嚴蔚敏的數據結構(C語言版)上的代碼實現的。
#pragmaonce
#include<stdio.h>
#include<tchar.h>
#include<stdlib.h>
#define MAX 100
typedefstruct{ //節點
int weight;
int parent, lchild, rchild;
}HTNode, *HuffmanTree;
typedefchar **HuffmanCode; //字元串數組,用於存儲葉子節點的編碼
void SelectMinNode(HuffmanTree &HT, int m, int &i1, int &i2) //找出權值最小的兩個節點對應的數組下標
{
HuffmanTree p = HT;
int s1, s2;
s1 = s2 = MAX;
i1 = i2 = 1;
for(int i=1; i<=m; i++)
{
if(!(p+i)->parent)
{
if((p+i)->weight < s1)
{
i2 = i;
s1 = (p+i)->weight ;
}
}
}
for(int i=1; i<=m; i++)
{
if(!(p+i)->parent && i!=i2)
{
if((p+i)->weight < s2)
{
i1 = i;
s2 = (p+i)->weight ;
}
}
}
}
void StrCopy(char *p, char *q, int start) //從字元數組中第start個字元開始復制
{
char *c1, *c2;
c1 = p;
while(q[start] != '\0')
{
*c1 = q[start];
c1++;
start++;
}
*c1 = q[start];//別忘了將『\n』復制過來
}
void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n)
{ //HT赫夫曼樹節點數組,HC存儲赫夫曼編碼,*w 節點權值數組的首地址,n節點個數
int i, i1, i2, m;
HuffmanTree p;
if(n<=1) return;
m = 2 * n -1; //n個葉子節點的赫夫曼樹的節點總數為2n-1,可以結合樹的度為n-1自己證明。
HT = (HuffmanTree)malloc((m+1)*sizeof(HTNode)); //數組首元素不使用,故多分配一個空間
p = HT + 1;
for(i=1;i<=n;++i,++p,++w) //n個葉子節點初始化
{
p->weight = *w;
p->lchild = 0;
p->rchild = 0;
p->parent = 0;
}
for(;i<=m;++i,++p) //非葉子節點初始化
{
p->weight = 0;
p->lchild = 0;
p->rchild = 0;
p->parent = 0;
}
for(i=n+1;i<=m;++i) //對非葉子節點重新計算
{
SelectMinNode(HT, i-1, i1, i2);
HT[i1].parent = i;
HT[i2].parent = i;
HT[i].lchild = i1;
HT[i].rchild = i2;
HT[i].weight = HT[i1].weight + HT[i2].weight ;
}
///從葉子節點到根節點求赫夫曼編碼
char* cd;
int start, c, f;
HC = (HuffmanCode)malloc((n+1)*sizeof(char*));//分配字元指針數組,同樣多分配一個
cd = (char*)malloc(n*sizeof(char)); //零時變數,用於存儲當前葉子節點的赫夫曼編碼
cd[n-1] = '\0';
for(int i=1; i<=n; i++)
{
start = n-1;
for(c=i,f=HT[i].parent; f!=0;c=f,f=HT[f].parent)
{
if(HT[f].lchild == c)
cd[--start] = '0';
else
cd[--start] = '1';
}
HC[i] = (char*)malloc((n-start)*sizeof(char));
StrCopy(HC[i], cd, start); //將存儲的編碼給HC的第i個數組
}
free(cd);
}
void PrintHuffmanCode(HuffmanTree HT, HuffmanCode HC, int n) //列印各節點的赫夫曼編碼
{
HuffmanCode p;
for(int i=1; i<=n; i++)
{
p = HC;
printf("The weight %d HuffmanCode is: ", HT[i]);
while(*p[i]!='\0')
{
printf("%c",*p[i]);
p[i]++;
}
printf("\n");
}
}
void main()
{
int n = 8;
HuffmanTree HT;
HuffmanCode HC;
int a[8] = {5, 29, 7, 8, 14, 23, 3, 11};//信號源的概率分布,即P={p0, p1,…, pK-1}
HuffmanCoding(HT, HC, a, n);
PrintHuffmanCode(HT, HC, n);
system("pause");}
② c語言加權平均
#include <stdio.h>
using namespace std;
int main()
{
int a[11];
int b = 0;
for (int i = 0; i < 11; i++)
{
scanf_s("%d", &a[i]);//輸入間打空格鍵,如下圖
//a[i] = getchar();註:getchar()不行,它讀取的是輸入的字元,即你輸入10,結果它讀取為1和0.
b += a[i];
}
float c = 0;
c = (float)b / 11; //c為答案
printf("%f
", c);
return 0;
}
③ 求c語言算加權平均分的代碼
//經過調試,可以運行
#include"stdio.h"
#include "ctype.h"
#define NAME_LEN 999
#define MAX_PRO 999
int num_parts = 0;
float total_hours = 0,ave_marks = 0;
struct
{
char pro_name[NAME_LEN+1];
float cre_hour;
float marks;
}project[MAX_PRO];
void sum_credit_hour(void);
void GPA(void);
void print(void);
int read_line(char str[], int);
int main()
{
char code;
printf("This program is edited by siyuan lu.\n"
"if you want to make your life more convinent,please ask him to get more.\n\n");
for(;;)
{
printf("操作碼:\ni 寫入科目及學分\ng 顯示平均學分\np 顯示已輸入的數據\nq 退出程序");
printf("\n請輸入操作碼: ");
scanf(" %c", &code);
//冗餘語句
/*************************
while (getchar() != '\n')
;
*************************/
switch ((int)code)
{
case 105: sum_credit_hour();break;
case 103: GPA();break;
case 112: print();break;
case 113: goto L;break;
default : printf("非法的輸入碼!");
}
printf("\n");
}
L: ;
return 0;
}
/*這個函數的功能是寫入科目名稱及學分數並計算已輸入的總學分數 這個函數使用了結構體變數*/
void sum_credit_hour(void)
{
int i;
char j;
printf("請輸入學科名稱:");
read_line(project[num_parts].pro_name, NAME_LEN);
printf("請輸入學科學分數:");
scanf("%f", &project[num_parts].cre_hour);
printf("請輸入您的成績:");
scanf("%f", &project[num_parts].marks);
total_hours += project[num_parts].cre_hour;
num_parts++;
}
/*這個函數的功能是計算並顯示加權平均分 這個函數使用了結構體變數*/
void GPA(void)
{
int i,total_marks = 0;
for(i = 0;i < num_parts; i++)
{
total_marks += project[i].marks * project[i].cre_hour;
}
ave_marks = total_marks / (int)total_hours;
printf("您的加權平均分為:%.2f
", ave_marks);
}
/*這個函數的功能是顯示已輸入的數據 這個函數使用了結構體變數*/
void print(void)
{
int i;
printf("學科 學分數 " "成績\n");
for(i = 0;i < num_parts; i++)
printf("%-10s %-16f%8f\n", project[i].pro_name, project[i].cre_hour,project[i].marks);
}
int read_line(char str[], int n)
{
int ch, i = 0;
while (isspace(ch = getchar()))
;
while (ch != '\n' && ch != EOF)
{
if (i < n)
str[i++] = ch;
ch = getchar();
}
str[i] = '\0';
return i;
}
自己多練練,求這種代碼容易被鄙視。。
④ C語言代碼中的「#」、「()」等代表什麼
我可能應該知道你意思了呢,
是不是你認為#define,#include之類的預處理命令後面沒有分號?!
原因是他們不是C語句,
C語言的標准說的是一個完整的C語句必須用分號結束,
「預處理命令不是C語言語句」這是標准C的規定的,記住就行
相信樓上說的比較清楚了,我不多嘮叨了,現在你明白了吧,呵呵。。。
⑤ C語言指針的問題 能幫我分析下以下的代碼嗎,看不太明白
#include <stdio.h>
int main(void)
{
char *p,s[6]; //定義6個長度的字元數組和一個指向字元的指針
int n; //定義整形變數n
n=0; //給n賦初值0
p=s; //一維數組名代表數組第一個元素的地址,即p存著s[0]的地址
printf("輸入你要轉換的八進制數:\n"); //輸入提示
gets(p); //輸入字元串,在最後一個字元後面會自動加'\0'
while(*(p)!='\0') //對指針p解引用,並判斷是否為'\0',即判斷字元串是否已經結束
{
n=n*8+*p-'0'; //*p就是p所指向的字元,*p-'0'就是p所指向的字元的ASCII減去0的ASCII,就是這個字元所代表的真實數字
p++; //指針後移,由於指針指向一維數組,即代表指針指向下一個元素
}
printf("轉換的十進制是:\n%d\n",n); //輸出結果
return 0;
}
⑥ 用C語言計算加權分數
本人(無界)用C-Free親手編寫的,親測可運行
#include<stdio.h>
structstu{ //用結構體數組儲存學生的成績和學分
floatscore; //成績
floatcredit; //學分
}Stu[100];
intmain()
{
unsignedintx=1,y=0;
//y用於結構體數組Stu,同時用於循環計算該學生成績
doublesxcsum=0,csum=0,sum;
//sxcsum記錄所有成績乘以學分之和
//csum學分之和
//sum加權成績
printf("提示:輸入完後按回車鍵結束,輸入負數代表學生成績輸入完成 ");
while(1) //循環用戶輸入成績,直到用戶輸入完成後結束
{
printf("請輸入第%d門課程的成績:",x);
scanf("%f",&Stu[y].score);
getchar(); //吸收回車鍵字元
if(Stu[y].score<0)break; //輸入負數結束循環,結束學生輸入成績操作
printf("請輸入第%d門課程的學分:",x++);
scanf("%f",&Stu[y++].credit);
getchar();
if(Stu[y-1].credit<0)break;
}
printf("---輸入成績結束--- ");
for(x=0;x<y;x++)//循環計算成績,直到算完所有課程,y變數儲存共有多少門課程
{
sxcsum+=Stu[x].score*Stu[x].credit;
csum+=Stu[x].credit;
}
sum=sxcsum/csum;
printf("該學生的加權成績為:%g ",sum);
return(0);
}
---「無界」回答---
⑦ 用C語言編寫以下演算法: 一個5個節點的有向圖,有向線段上有權重即T[i][j],它表示節點i對節點j的信任度。
寫C程序,隨機給出n*n的鄰接矩陣,並列印輸出鄰接矩陣,以及有向圖的邊的個數,每個頂點的度,並判斷該圖中是否存在Euler迴路: (1)如果為n階,則隨機產生一個n*n的鄰接矩陣; (2)輸出鄰接矩陣,邊的個數,每個頂點的度以及圖中是否存在Euler迴路。 這個題目涉及到了兩個主要的知識點,一個是數據結構中的有向圖的鄰接矩陣的創建,還有就是離散數學中的Euler迴路的判定定理。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#define n 5 //定義矩陣的階數n
typedef int ver;
typedef int edg; //定義有向圖的頂點和邊值為整形
typedef struct{
ver v[n]; //頂點
edg e[n][n]; //邊權
}graph; //定義鄰接矩陣的數據結構
void printgraph (graph G) //列印輸出鄰接矩陣
{
int i,j;
printf("頂點");
for(i=0;i<n;i++)
printf("%3d",i);
printf("\n");
for(i=0;i<n;i++)
{
printf("%4d",i);
for(j=0;j<n;j++)
printf("%3d",G.e[i][j]);
printf("\n");
}
}
void countD (graph G) //判斷有向圖的頂點的度,並判斷Euler迴路
{
int i,j,l;
int e=0,count=0;
int k; //計數器賦0
int c[n],d[n];
for (i=0;i<n;i++){
c[i]=0;
for (j=0;j<n;j++){
if (G.e[i][j]!=0)
c[i]=c[i]+1;
}
printf("頂點 %d 的出度為: %d \n",i,c[i]); //有向圖的任意頂點i的出度為鄰接矩陣中第i行不為0的數的個數
}
printf("\n");
for (j=0;j<n;j++){
d[j]=0;
for (i=0;i<n;i++){
if (G.e[i][j]!=0)
d[j]=d[j]+1;
}
printf("頂點 %d 的入度為: %d \n",j,d[j]); //有向圖的任意頂點j的入度為鄰接矩陣中第j列不為0的數的個數
}
for (l=0;l<n;l++){
if (c[l]==d[l])
count++;
else {
if (c[l]-d[l]==1)
e++;
else{
if (d[l]-c[l]==1)
e++;
}
}
}
k=0;
if (count==n) //判斷Euler迴路: 1:所有頂點的出度等於入度;
//2:有且僅有兩個點度數為奇數,且一個出度比入度大一
k=1; //另一個入度比出度大一,其他的頂點出度等於入度
else {
if (e==2 && count==n-2)
k=1;
}
if (k==1)
printf("有向圖中存在Euler迴路\n");
else
printf("有向圖中不存在Euler迴路\n");
}
void main() //主函數
{
int i,j,temp;
graph G;
srand(time (NULL)); //隨機種子
for (i=0;i<n;i++){
for (j=0;j<n;j++)
G.e[i][j]=0;
}
for (i=0;i<n;i++)
G.v[i]=0;
for (i=0;i<n;i++){
for (j=0;j<n;j++){
do
{
temp = rand()%n; //隨機建造鄰接矩陣
if (G.v[i]<n)
{
G.e[i][j] = temp;
G.v[i]++;
break;
}
}
while (1);
}
}
printf("生成的有向圖鄰接矩陣為: \n");
printgraph(G);
countD (G); //調用子函數
printf("有向圖的邊數為:%d\n",n*(n-1)/2);
}
另外,團IDC網上有許多產品團購,便宜有口碑
⑧ C語言 關於權重的 問題
唉,你這錯誤也太多了吧。
/****考生在以下空白處寫入執行語句******/
for(i=0;i<n;i++)
{
a[i]=(i+1)*((int)s[i]);
printf("%d ",a[i]);
}
/****考生在以上空白處寫入執行語句******/
⑨ c語言 要為產生的隨機數加上權重 如在6-18內產生100個隨機數,6-9出現頻率為25%,10-14為50%,15-18為25%
這樣改吧:
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
voidmain()
{
inti,j;
srand((unsigned)time(NULL));
for(i=0;i<100;i++)
{
j=rand()%100;
if(j<25) //6到10的25%
{
j=rand()%10;
while(j<6)
j=rand()%10;
}
elseif(j<75) //11到14的50%
{
j=rand()%15;
while(j<10)
j=rand()%15;
}
else //15到18的25%
{
j=rand()%19;
while(j<15)
j=rand()%19;
}
printf("%d ",j);
}
}
⑩ 創建一個哈夫曼樹並且進行編碼權重如下w={5,29,7 8,14,13 ,3 ,11}寫出c語言代碼
#include"stdafx.h"
#include"hfm.h"
#include<string.h>
#include<malloc.h>//malloc()等
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<limits.h>
#include<iostream>
#defineTRUE1
#defineFALSE1
#defineOK1
#defineERROR1
#defineINFEASIBLE-1
typedefintStatus;
typedefintBoolean;
/************************************************************************/
/*最優二叉樹簡稱:哈夫曼樹*/
/************************************************************************/
//哈夫曼樹結構
;typedefstruct{
unsignedintweight;//權重
unsignedintparent,lchild,rchild;//樹的雙親節點,和左右孩子
}HTNode,*HuffmanTree;
typedefchar**HuffmanCode;
//返回i個節點中權值最小的樹的根節點的序號,供select()調用
intMin(HuffmanTreeT,inti){
intj,flag;
unsignedintk=UINT_MAX;//%d-->UINT_MAX=-1,%u--->非常大的數
for(j=1;j<=i;j++)
if(T[j].weight<k&&T[j].parent==0)
k=T[j].weight,flag=j;//
T[flag].parent=1;//將parent標志為1避免二次查找
returnflag;//返回
}
voidSelect(HuffmanTreeT,inti,int&s1,int&s2){
//在i個節點中選取2個權值最小的樹的根節點序號,s1為序號較小的那個
intj;
s1=Min(T,i);
s2=Min(T,i);
if(s1>s2){
j=s1;
s1=s2;
s2=j;
}
}
//HuffmanCode代表的樹解碼二進制值
voidHuffmanCoding(HuffmanTree&HT,HuffmanCode&HC,int*w,intn){
//w存放n個字元的權值(均>0),構造哈夫曼樹HT,並求出n個字元的哈夫曼編碼HC
intm,i,s1,s2,start;
unsignedc,f;
char*cd;
//分配存儲空間
HuffmanTreep;
if(n<=1)
return;
//n個字元(葉子節點)有2n-1個樹節點,所以樹節點m
m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));//0號元素未用
//這一步是給哈夫曼樹的葉子節點初始化
for(p=HT+1,i=1;i<=n;++i,++p,++w)
{
(*p).weight=*w;
(*p).lchild=0;
(*p).rchild=0;
(*p).parent=0;
}
//這一步是給哈夫曼樹的非葉子節點初始化
for(;i<=m;++i,++p){
(*p).parent=0;
}
/************************************************************************/
/*做完准備工作後,開始建立哈夫曼樹
/************************************************************************/
for(i=n+1;i<=m;i++)
{
//在HT[1~i-1]中選擇parent=0且weigh最小的節點,其序號分別為s1,s2
Select(HT,i-1,s1,s2);//傳引用
HT[s1].parent=HT[s2].parent=i;
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
/************************************************************************/
/*從葉子到根逆求每個葉子節點的哈夫曼編碼*/
/************************************************************************/
//分配n個字元編碼的頭指針向量,([0]不用)
HC=(HuffmanCode)malloc((n+1)*sizeof(char*));
cd=(char*)malloc(n*sizeof(char));//分配求編碼的工作空間
cd[n-1]='