数据结构的代码需要记吗,比如链表,堆栈的创建,插入,删除,销毁等操作的代码?

栏目:资讯发布:2023-11-20浏览:2收藏

数据结构的代码需要记吗,比如链表,堆栈的创建,插入,删除,销毁等操作的代码?,第1张

给你一个更简单的:

#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;

}

数据结构的代码需要记吗,比如链表,堆栈的创建,插入,删除,销毁等操作的代码?

给你一个更简单的:#include<iostream>#include<string>using namespace std;struct List{int num;List next;};List head=NULL;List ...
点击下载
热门文章
    确认删除?
    回到顶部