数据结构的代码需要记吗,比如链表,堆栈的创建,插入,删除,销毁等操作的代码?
给你一个更简单的:
#include<iostream>
#include<string>
using namespace std;
struct List
{
int num;
List next;
};
List head=NULL;
List CreateList()
{
List pL;
List pEnd;
pL=new List;
head=pL;
pEnd=pL;
cout<<"请输入节点的数目,以 0 结束"<<endl;
cin>>pL->num;
while(pL->num!zhi=0)
{
pEnd->next=pL;
pEnd=pL;
pL=new List;
cin>>pL->num;
}
delete pL;
pEnd->next=NULL;
return head;
}
void ShowList(List head)
{
cout<<endl;
cout<<"链表节点如下:"<<endl;
while(head)
{
cout<<head->num<<endl;
head=head->next;
}
}
void InsertList(List head,int num)
{
List list =new List;
List l;
while(head)
{
l=head;
head=head->next;
}
list->num=num;
list->next=NULL;
l->next=list;
}
void DeleteList(List head, int num)
{
List l;
if(head->num==num)
{
l=head;
head=head->next;
::head=head;
delete l;
return ;
}
List l1=head;
while(head)
{
if(head->next==NULL){
cout<<"找不到不要删除的数字"<<endl;
return ;
}
if(head->next->num==num)
{
l=head->next;
head->next=l->next;
delete l;
::head=l1;
cout<<"操作成功"<<endl;
return ;
}
head=head->next;
}
cout<<"找不到不要删除的数字"<<endl;
}
int GetListNum(List head)
{
int num=0;
while(head)
{
num++;
head=head->next;
}
return num;
}
int main()
{
string str;
begin:
cout<<"1->增加链表 2->显示链表 3->插入节点 4->删除节点 5->节点数目"<<endl;
cin>>str;
if(str[0]=='1')
{
CreateList();
}
else if(str[0]=='2')
{
if(head==NULL)
{
cout<<"你的链表现在是空的,请增加链表"<<endl;
getchar();
getchar();
system("cls");
goto begin;
}
ShowList(head);
}
else if(str[0]=='3')
{
if(head==NULL)
{
cout<<"你的链表现在是空的,请增加链表"<<endl;
getchar();
getchar();
system("cls");
goto begin;
}
int num;
cout<<"请输入要插入的数字:"<<endl;
cin>>num;
InsertList(head,num);
}
else if(str[0]=='4')
{
if(head==NULL)
{
cout<<"你的链表现在是空的,请增加链表"<<endl;
getchar();
getchar();
system("cls");
goto begin;
}
int num;
cout<<"请输入要删除的数字:"<<endl;
cin>>num;
DeleteList(head,num);
}
else if(str[0]=='5')
{
cout<<"节点数是:"<<GetListNum(head)<<endl;
}
else
{
cout<<"输入错误,请重新输入";
}
if(str[0]!='Q' && str[0]!='q'){
cout<<endl<<endl;
getchar();
getchar();
system("cls");
goto begin;
}
}
很难吗?树结构哦。看你数据结构学的怎么样呗。呵呵,我先想到的数据结构是双亲孩子表示法,当然查找关系的时候就要进行一些条件设置,比如祖孙的关系数大于父子的关系数2,兄弟拥有相同的双亲,堂兄弟的双亲是兄弟,回溯到相同的祖先结点则有共同的祖先咯。
#include <iostream>
#include <stdioh>
#include <stdlibh>
#include <stringh>
#include <fstream>
#include <iomanip>
#define INF 10000
using namespace std;
//------哈夫曼树的存储表示------
typedef struct
{
char data; //结点的字符
int weight; //结点的权值
int parent,lchild,rchild; //结点的双亲,左孩子,右孩子下标
}HTNode,HFMTree;
HFMTree HT;
//------哈夫曼编码表的存储表示------
typedef char HFMcode; //动态分配数组存储哈夫曼编码表
HFMcode HC;
int N; //字符集个数
//函数声明
void hello(); //欢迎界面
void func(); //具体功能函数
void initHFM(HFMTree &,int); //构造哈夫曼树
void select(HFMTree,int,int&); //构造哈弗曼树的子函数--选择结点
void creatHFMcode(HFMTree,HFMcode &,int); //求哈夫曼编码
void add_code_to_file(HFMTree,HFMcode,int); //将初始哈夫曼编码存入文件hfmTree中
void Encoding(); //编码
void Decoding(); //译码
void Print(); //显示编码
//函数定义
void hello()
{
cout<<"该系统可实现如下功能\n"
<<"I初始化构造哈夫曼树和哈弗曼编码并存在文件中\n"
<<"E利用已建好的哈夫曼树对文件中的正文进行编码\n"
<<"D利用已建好的哈夫曼树将文件中的代码进行译码\n"
<<"P将编码文件显示在终端上面并保存在文件中\n"
<<"T打印哈弗曼树\n"
<<"O退出系统"<<endl;
func();
}
void func()
{
cout<<"输入相应字母,实现对应功能:";
char c;
cin>>c;
switch(c)
{
case'I':case'i':cout<<"请先输入字符集个数:";cin>>N;initHFM(HT,N);break;
case'E':case'e':Encoding();break;
case'D':case'd':Decoding();break;
case'P':case'p':Print();break;
case'T':case't':;
case'O':case'o':case'0':exit(0);
default:cout<<"输入有误,请重新输入\n";
func();break;
}
}
void initHFM(HFMTree &HT,int n)
{//构造哈弗曼树和哈弗曼编码
if(n<=1)
{
cerr<<"构造失败,请继续操作"<<endl;
hello();
}
int m=2n-1;
HT=new HTNode[m+1]; //0号单元未用,所以需要动态分配m+1个二单元
for(int i=1;i<=m;i++)
HT[i]lchild=HT[i]parent=HT[i]rchild=0;
cout<<"请输入前"<<n<<"个单元叶子结点的字符:";
getchar();
for(int i=1;i<=n;i++)
HT[i]data=getchar(); //输入前n个单元叶子结点的字符
cout<<"请输入前"<<n<<"个单元叶子结点的权值:";
getchar();
for(int i=1;i<=n;i++)
cin>>HT[i]weight; //输入前n个单元叶子结点的权值
for(int i=n+1;i<=m;i++)
{//用过n-1次的选择,删除,合并来创建哈夫曼树
int s1,s2;
select(HT,i-1,s1);select(HT,i-1,s2);
//在HT[k](1<=k<=i-1)中选择两个其双亲域为0且权值最小的点,并返回他们的序号s1,s2
HT[i]lchild=s1;HT[i]rchild=s2;
HT[i]weight=HT[s1]weight+HT[s2]weight;
}
creatHFMcode(HT,HC,n); //求哈夫曼编码
add_code_to_file(HT,HC,n); //将初始哈夫曼编码存入文件中
cout<<"构造成功,请继续操作\n";
hello();
}
void select(HFMTree HT,int x,int &s)
{
int minn=INF;
for(int j=1;j<=x;j++)
{
if(HT[j]parent)
continue;
else
{
if(minn>HT[j]weight)
{
minn=HT[j]weight;
s=j;
}
}
}
HT[s]parent=x+1;
}
void creatHFMcode(HFMTree HT,HFMcode &HC,int n)
{//从叶子到根逆向求每个字符的哈夫曼编码,存储在编码表HC中
HC=new char[n+1]; //分配存储n个字符编码的动态数组空间
char cd=new char[n]; //分配临时存放每个字符编码的动态数组空间
cd[n-1]='\0'; //编码结束符
for(int i=1;i<=n;i++) //逐个字符求哈夫曼编码
{
int start=n-1; //start开始时指向最后,及编码结束符位置
int c=i,f=HT[i]parent; //f指向c的双亲结点
while(f!=0)
{
--start;
if(HT[f]lchild==c)
cd[start]='0';
else cd[start]='1';
c=f;
f=HT[f]parent;
}
HC[i]=new char[n-start];
strcpy(HC[i],&cd[start]);
}
delete cd;
}
void add_code_to_file(HFMTree HT,HFMcode HC,int n)
{//将初始哈夫曼编码存入文件hfmTree中
ofstream out;
outopen("hfmTreetxt",ios::out);
out<<left;
out<<setw(4)<<"字符"<<':'<<"编码"<<endl;
for(int i=1;i<=n;i++)
out<<' '<<HT[i]data<<" :"<<HC[i]<<'\n';
outclose();
}
void Encoding()
{
ofstream out1;
out1open("ToBeTrantxt",ios::out);
out1<<"THIS PROGRAM IS MY FAVORITE";
out1close();
ifstream in;
inopen("ToBeTrantxt",ios::in);
char str[1000];
ingetline(str,999);
ofstream out2;
out2open("CodeFiletxt",ios::out);
for(int i=0;str[i]!='\0';i++)
{
for(int j=1;j<=N;j++)
{
if(str[i]==HT[j]data)
{out2<<HC[j];out2<<' ';}
}
}
out2close();
inclose();
cout<<"编码成功,请继续操作\n";
hello();
}
void Decoding()
{
ifstream in;
inopen("CodeFiletxt",ios::in);
char str[1000];
ingetline(str,999);
for(int i=0;str[i]!='\0';)
{
char s[N];
int j=i;
int t=0;
while(str[j]!=' ')
{
s[t]=str[j];
t++;
j++;
i++;
}
s[t]='\0';
//cout<<s<<' ';
for(int x=1;x<=N;x++)
if(strcmp(s,HC[x])==0)
cout<<HT[x]data;
i++;
}
inclose();
cout<<"\n译码成功,请继续操作\n";
hello();
}
void Print()
{
ifstream in;
inopen("CodeFiletxt",ios::in);
char str[1000];
ingetline(str,999);
ofstream out;
outopen("CodePrintxt",ios::out);
int t=0;
for(int i=0;str[i]!='\0';i++)
{
if(str[i]!=' ')
{
cout<<str[i];
t++;
out<<str[i];
if(t%50==0)
cout<<'\n';
}
}
inclose();
outclose();
cout<<"\n显示完毕并保存成功,请按回车键继续操作\n";
getchar();getchar();
hello();
}
int main()
{
hello();
return 0;
}
数据结构的代码需要记吗,比如链表,堆栈的创建,插入,删除,销毁等操作的代码?
本文2023-11-20 11:49:01发表“资讯”栏目。
本文链接:https://www.lezaizhuan.com/article/514891.html