❶ 求嚴蔚敏教授編寫的(《數據結構》c語言版)中赫夫曼演算法的完整代碼

//*************預定義****************
# include <stdio.h>
# include <malloc.h>
# include <iostream.h>
# include <conio.h>
# include <string.h>
# define MAX_LENGTH 100
typedef char **HuffmanCode;
//**********數據結構*************
typedef struct
{ int weight; //權值
int parent,lchild,rchild; //雙親,左右孩子
}HTNode,*HuffmanTree; //結點和指針
//**********select函數**************
void Select(HuffmanTree HT,int i,int &s1,int &s2)
{ //在建立哈夫曼樹的所有結點中選擇權值最小的兩個結點存放在s1,s2中
int j,k=1;
while(HT[k].parent!=0)
k++;
s1=k;
for(j=1;j<=i;++j)
if(HT[j].parent==0&&HT[j].weight<HT[s1].weight)
s1=j;
k=1;
while((HT[k].parent!=0||k==s1))
k++;
s2=k;
for(j=1;j<=i;++j)
if(HT[j].parent==0&&HT[j].weight<HT[s2].weight&&j!=s1)
s2=j;
}
//**********構建哈夫曼樹***********************
void HuffmanCoding(huffmanTree &HT,hu)
void HuffmanCoding(HuffmanTree &HT,HuffmanCode&HC,int *w,int n)
{ int m,i,s1,s2,start,c,f;
HuffmanTree p;
if(n<=1)
return;
m=2*n-1;//由得到的葉子數而計算結點總數
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));//分配存儲空間
for(p=HT+1,i=1;i<=n;++i,++p,++w)
{ p->weight=*w;//為結點初始化權值
cout<<endl<<"HT["<<i<<"].weight="<<p->weight<<" ";
p->parent=0;
p->lchild=0;
p->rchild=0;
}
for(;i<=m;++i,++p)
{ p->weight=0;
p->parent=0;
p->lchild=0;
p->rchild=0;
}//初始化雙親和左右孩子,使他們成為孤立的
cout<<endl<<endl<<"哈弗曼樹創建的順序如下:";
for(i=n+1;i<=m;++i)
{ Select(HT,i-1,s1,s2); //調用select函數
HT[s1].parent=i;
HT[s2].parent=i;
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;//新結點的權值是s1和s2權值的和
cout<<endl<<"HT["<<s1<<"] and HT["<<s2<<"] create";
cout<<" HT["<<i<<"], weight="<<HT[i].weight;
}//每次選擇最小的兩個結點做左右孩子,權值和為新的結點的權值和,刪去連個小的結點
//*********哈夫曼編碼*****************
HC=(HuffmanCode)malloc((n+1)*sizeof(char *));
char *cd;
cd=(char *)malloc(n*sizeof(char));
cd[n-1]='\0';
cout<<endl<<endl<<"HuffmanTree編碼是:"<<endl;
for(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));
strcpy(HC[i],&cd[start]);
printf("\nHT[%d] node's Huffman code is: %s",i,HC[i]);
}
free(cd);
}
//****************主函數部分********************
void main()
{ HuffmanTree HT;
HuffmanCode HC;
int n,i;
int *w,W[MAX_LENGTH];
cout<<"***********本實驗實現的是哈夫曼樹的建立以及編碼*********";//交互信息
cout<<endl<<"請輸入哈弗曼樹元素的個數: ";
cin>>n;
for(i=0;i<n;++i)
{ cout<<"請輸入第 "<<i+1<<"個元素的權值(0~255的整數): ";
cin>>W[i];
}
w=W;
HuffmanCoding(HT,HC,w,n);
getch();
}
個人覺得這個有點長。。不知道對不對。看看吧~

❷ 求解數據結構與演算法題(C語言版)

一個遍歷找到x,好像是
if(p.data等於x),
printf p.data
else
p等於p.left,
p等於p.right
注前序遍歷,此時p指向x
treeLeft等於new tree(p.left)
treeRight等於new tree(p.right)
注,以版x的左,權右子樹為根,分別構造二叉樹
class tree,class node 自己寫吧

❸ 數據結構演算法(C語言描述)和C或C++程序具體什麼關系啊

1、程序是寫完源代碼後,計算機編譯後得到的可執行文件。
2、演算法一般結合數學思想,以下內容算是演算法:
給數組按大小排序、查找數組某元素、圖形處理演算法、音頻識別處理。
但廣義上,用了順序分支循環就是演算法。

❹ 數據結構C語言——實現各種排序演算法

剛做完的
#include <iostream>
using namespace std;

void BiInsertsort(int r[], int n) //插入排序(折半)
{
for(int i=2;i<=n;i++)
{
if (r[i]<r[i-1])
{
r[0] = r[i]; //設置哨兵
int low=1,high=i-1; //折半查找
while (low<=high)
{
int mid=(low+high)/2;
if (r[0]<r[mid]) high=mid-1;
else low = mid+1;
}
int j;
for (j=i-1;j>high;j--) r[j+1] = r[j]; //後移
r[j+1] = r[0];
}
}
for(int k=1;k<=n;k++) cout<<r[k]<<" ";
cout<<"\n";
}

void ShellSort ( int r[], int n) //希爾排序
{
for(int d=n/2;d>=1;d=d/2) //以d為增量進行直接插入排序
{
for (int i=d+1;i<=n;i++)
{
r[0] = r[i]; //暫存被插入記錄
int j;
for( j=i-d; j>0 && r[0]<r[j]; j=j-d) r[j+d] = r[j]; //記錄後移d個位置
r[j+d] = r[0];

}
}
for(int i=1;i<=n;i++) cout<<r[i]<<" ";
cout<<"\n";
}

void BubbleSort(int r[], int n) //起泡排序
{
int temp,exchange,bound;
exchange=n; //第一趟起泡排序的范圍是r[0]到r[n-1]
while (exchange) //僅當上一趟排序有記錄交換才進行本趟排序
{
bound=exchange;
exchange=0;
for (int j=1; j<bound; j++) //一趟起泡排序
if (r[j]>r[j+1])
{
temp=r[j];
r[j]=r[j+1];
r[j+1]=temp;
exchange=j; //記錄每一次發生記錄交換的位置
}
}
for(int i=1;i<=n;i++) cout<<r[i]<<" ";
cout<<"\n";
}

int Partition(int r[], int first, int end) //快速排序一次劃分
{
int i=first; //初始化
int j=end;
r[0]=r[first];
while (i<j)
{
while (i<j && r[0]<= r[j]) j--; //右側掃描
r[i]=r[j];
while (i<j && r[i]<= r[0]) i++; //左側掃描
r[j]=r[i];
}
r[i]=r[0];
return i; //i為軸值記錄的最終位置
}
void QuickSort(int r[], int first, int end) //快速排序
{
if (first<end)
{ //遞歸結束
int pivot=Partition(r, first, end); //一次劃分
QuickSort(r, first, pivot-1);//遞歸地對左側子序列進行快速排序
QuickSort(r, pivot+1, end); //遞歸地對右側子序列進行快速排序
}
}

void SelectSort(int r[ ], int n) //簡單選擇排序
{
int i,j,index,temp;
for (i=1; i<n; i++) //對n個記錄進行n-1趟簡單選擇排序
{
index=i;
for (j=i+1; j<=n; j++) //在無序區中選取最小記錄
if (r[j]<r[index]) index=j;
if (index!=i)
{
temp=r[i];
r[i]=r[index];
r[index]=temp;
}
}
for(i=1;i<=n;i++) cout<<r[i]<<" ";
cout<<"\n";
}

void main()
{
const int numv=12;
int a[3][numv]={{0,6,13,19,23,37,39,41,45,48,58,86},{0,86,58,48,45,41,39,37,23,19,13,6},{0,23,13,48,86,19,6,41,58,37,45,39}};
int z1[numv],z2[numv];
int m,n;
cout<<"請選擇測試數據類型:⑴正序 ⑵逆序 ⑶隨機 [ 若跳出,請按⑷ ]" <<endl;
cin>>m;
while(m>0&&m<4)
{
cout<<"請選擇排序演算法:⑴直接插入排序 ⑵希爾排序 ⑶冒泡排序 ⑷快速排序 \n ⑸簡單選擇排序"<<endl;
cin>>n;
switch(n)
{
case 1:
cout << "直接插入排序前:" << "\n";
for(int j=1;j<numv;j++) cout<<a[m-1][j]<<" ";
cout << "\n直接插入排序結果為:" << "\n";
BiInsertsort(a[m-1],numv-1);
break;
case 2:
cout << "\n希爾排序前:" << "\n";
for(int j=1;j<numv;j++) cout<<a[m-1][j]<<" ";
cout << "\n希爾排序結果為:" << "\n";
ShellSort(a[m-1], numv-1);
break;
case 3:
cout << "\n冒泡排序前:" << "\n";
for(int k=1;k<numv;k++) cout<<a[m-1][k]<<" ";
cout << "\n冒泡排序結果為:" << "\n";
BubbleSort(a[m-1], numv-1);
break;
case 4:
cout << "\n快速排序前:" << "\n";
for(int j=1;j<numv;j++) cout<<a[m-1][j]<<" ";
cout << "\n快速排序結果為:" << "\n";
QuickSort(a[m-1],0,numv-1);
for(int i=1;i<numv;i++)
cout<<a[m-1][i]<<" ";
cout<<"\n";
break;
case 5:
cout << "\n簡單選擇排序前:" << "\n";
for(int j=1;j<numv;j++) cout<<a[m-1][j]<<" ";
cout << "\n簡單選擇排序結果為:" << "\n";
SelectSort(a[m-1],numv-1);
break;

default:
cout<<"輸入錯誤!"<<endl;
}
m=0;
cout<<"請選擇測試數據類型:⑴正序 ⑵逆序 ⑶隨機 [ 若跳出,請按⑷ ]" <<endl;
cin>>m;
}
if(m==4) cout<<"(*^__^*) 再見!"<<endl;
else cout<<"輸入錯誤!"<<endl;
}

❺ 數據結構C語言版演算法時間復雜度計算

把那些基本的時間復雜度記住,然後遇到循環就相乘,遇到順序結構就相加回,而一般高階答的復雜度可以吞並低階的。
比如說,二分法的復雜度是和log(n)同階,如果再出現在對n個數的遍歷的循環中,復雜度就是和n*log(n)同階。
如果先二分查找,再順序查找,就是n+log(n)。

❻ 請問大學學習數據結構與演算法(C語言版)需要多強的C語言基礎

有時間的話肯定是深入學習一下比較好,不過也不要有壓力,大學的東西都是「平易近人內」的,只容要你認真學肯定是沒問題的,頂多就是比基礎好的人多花點時間。
數據結構的話跟C語言還有點關系,但是大部分人對數據結構都不會很了解,所以基本可以認為你們處於同一起跑線。
演算法的話重要的是你的邏輯思維能力和數學功底,C語言只是實現演算法的工具,只要演算法理解透了,你可以用C++,可以用Java,甚至腳本語言Python,如果C語言基礎好,只會使你實現演算法的時候更加順手,但演算法的實現本不是演算法學習的精髓,演算法本身及邏輯能力的提高才是你需要重點關注的。

❼ 數據結構中常見的演算法(C語言版)

1、冒泡排序(最容易考到)
#include<stdio.h>
#define N 5

void main()
{
int i=0,j=0;
int a[n],temp;
int *ptr1,*ptr2;
ptr1=&a[j+1];
ptr2=&temp;
printf("\n輸入數字串:\n",N);
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);

}
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(a[j]<a[j+1])
{
/*交換元素*/
ptr2=a[j+1];
a[j+1]=a[j];
a[j]=ptr2;
}
}
}
printf("\n排序後的數字串:");
for(i=0;i<N;i++)
{
printf("%d",a[i]);
}
printf("\n");
}
2、統計字元個數
#include<stdio.h>
void main()
{
char line[100];
int i,count=0;
printf("\n請輸入一行字元: ");
gets(line);
i=0;
while(line[i]!='\0')
{
if(line[i]=='x'||line[i]=='X')
{
count++;
}
i++;
}
printf("\n其中X的個數為%d\n",count);

}
3、數字翻轉
#include<stdio.h>
void main()
{
int a,b;
a=0;
do
{
printf("\n請輸入一個數:");
scanf("%d",&a);
if(a<=0)
printf("該數必須為正數\n");
}while(a<=0);
printf("\n反轉後的數為:");
do
{
b=a%10;
printf("%d",b);
a=a/10;
}while(a!=0);
printf("\n");
}
我這里還有好多,需要的聯系我QQ

❽ 《數據結構(C語言版)》之「串的模式匹配演算法」

# include <string.h>
# include <stdio.h>
# include <stdlib.h>
# define OK 1
# define ERROR 0
typedef int Status;
//串的定長順序存儲結構
# define MAX_STR_LEN 40
typedef char SString[MAX_STR_LEN + 1];//0號單元存放串的長度
Status StrAssign(SString T,char * chars)//生成一個其值等於chars的串T
{
int i;
if (strlen(chars) > MAX_STR_LEN)
{
return ERROR;
}
else
{
T[0] = strlen(chars);
for (i=1; i<=T[0]; ++i)
{
T[i] = * (chars + i - 1);
}
return OK;
}
}
//返回串S的元素的個數
int StrLength(SString S)
{
return S[0];
}
//用Sub返回串S的自第pos個字元起長度為len的子串
Status SubString(SString Sub,SString S,int pos,int len)
{
int i;
if (pos<1 || pos>S[0] || len<0 || len>S[0]-pos+1)
{
return ERROR;
}
for (i=1; i<=len; ++i)
{
Sub[i] = S[pos+i-1];
}
Sub[0] = len;
return OK;
}
//輸出字元串T
void StrPrint(SString T)
{
int i;
for (i=1; i<=T[0]; ++i)
{
printf("%c ",T[i]);
}
printf("\n");
}
//求模式串T的next函數值並存入數組next
void get_next(SString T,int next[])
{
int i = 1,j = 0;
next[1] = 0;
while (i < T[0])
{
if (j==0 || T[i]==T[j])
{
++i;
++j;
next[i] = j;
}
else
{
j = next[j];
}
}
}
//求模式串T的next函數修正值並存入數組nextval
void get_nextval(SString T,int nextval[])
{
int i = 1,j = 0;
nextval[1] = 0;
while (i < T[0])
{
if (j==0 || T[i]==T[j])
{
++i;
++j;
if (T[i] != T[j])
{
nextval[i] = j;
}
else
{
nextval[i] = nextval[j];
}
}
else
{
j = nextval[j];
}
}
}
//利用模式串T的next函數求T在主串S中第pos字元之後的位置的KMP演算法
//1=<pos=<StrLength(S)
int Index_KMP(SString S,SString T,int pos,int next[])
{
int i = pos,j = 1;
while (i<=S[0] && j<=T[0])
{
if (j==0 || S[i]==T[j])
{
++i;
++j;
}
else
{
j = next[j];
}
}
if (j > T[0])
{
return i - T[0];
}
else
{
return 0;
}
}
int main(void)
{
int i,* p;
SString s1,s2;
StrAssign(s1,"aaabaaaab");
printf("主串為:");
StrPrint(s1);
StrAssign(s2,"aaaab");
printf("子串為:");
StrPrint(s2);
p = (int *)malloc((StrLength(s2) + 1) * sizeof(int));
get_next(s2,p);
printf("子串的next的數組為:");
for (i=1; i<=StrLength(s2); ++i)
{
printf("%d ",* (p+i));
}
printf("\n");
i = Index_KMP(s1,s2,1,p);
if (i)
{
printf("主串和子串在第%d個字元處首次匹配\n",i);
}
else
{
printf("主串和子串匹配不成功\n");
}
get_nextval(s2,p);
printf("子串的nextval數組為:");
for (i=1; i<=StrLength(s2); ++i)
{
printf("%d ",* (p+i));
}
printf("\n");
printf("主串和子串在第%d個字元處首次匹配\n",Index_KMP(s1,s2,1,p));
printf("求串s1的從第5個字元起長度為5的子串s2:\n");
SubString(s2,s1,5,5);
printf("串s2為:");
StrPrint(s2);
return 0;
}
/*
在vc++6.0中的輸出結果:
------------------------
主串為:a a a b a a a a b
子串為:a a a a b
子串的next的數組為:0 1 2 3 4
主串和子串在第5個字元處首次匹配
子串的nextval數組為:0 0 0 0 4
主串和子串在第5個字元處首次匹配
求串s1的從第5個字元起長度為5的子串s2:
串s2為:a a a a b
Press any key to continue
------------------------------
*/

❾ 數據結構的演算法如何變成C語言程序

1、演算法有啦一個大致的雛形後,想清楚演算法的流程,然後先將主程序打好,細節先用過程與版函數代替權。
2、然後再完善細節部分。
3、最後構造一些數據測試。
建議構造3種數據。
第一種隨機生成的大數據,以檢驗程序在平均情況下的時間效率。
第二種是人工構造的奇葩/猥瑣數據,且最好能確定答案,以檢驗其正確性,比如貪心的一些可能的反例。
最後一種是人工構造的特殊數據,比如,在有關樹的題目中,將輸入中的樹退化成一條鏈。

❿ 數據結構c語言版演算法2.3完整程序

同學,你這樣提問很難找到答案啊。
《數據結構c語言版》有很多版本的,沒有辦法知道你說的是哪一個版本。
或者,你就麻煩下把演算法描述打一遍發上來,不然我們沒有辦法幫到你