链表的创建、插入、修改、删除及队列的使用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、程序开发环境
1.操作系统:Windows all。
2.开发工具:Microsoft Visual C++6.0。
3.其他:无。
二、程序运行环境
1.操作系统:Windows all。
2.其他:无。
三、提交考试文档
用RAR压缩软件,将下列文件压缩为一个文件,取名“学号_姓名_中期考试文档.RAR”。
1.本实验报告。
2.源程序(*.C或*.CPP等文件):创建“源程序”文件夹,源程序放里面。
3.执行程序(*.EXE文件):创建“执行程序”文件夹,*.EXE文件放里面。
4.readme.txt:逐条详细说明本程序运行时,所需要的其他文件及存放路径。
四、软件系统说明
1.绘制程序的系统流程图,即各个功能模块的调用流程图。
——注:不是各个功能模块内部的实现流程。
3.结合流程图和主界面,逐个说明各个功能模块,如下:
1.链表操作
该模块会自动产生链表中data中的数据,并在产生之前询问要产生的个数。
产生之后可手动输入一个数程序会自动查找该数是否包含在随机产生的数当中若包含则返回该数所在的位置和包含该数的个数,然后询问用户是否要删除所查找出来的这些数,若选择删除则删除这些数后再输出删除后的链表。
void main()
{
NODE *head,*a,*p,*q,*j;
int n;
head=new node;
a=head;
head->next=NULL;
cout<<"请输入要产生的链表元素个数:";
cin>>n;
double x;
srand(time(0)); //随机产生链表
x=rand()%100;
for(int i=0;i<n;i++)
{
p=new node;
p->data=x;
p->next=a->next;
a->next=p;
a=p;
unsigned srand(time(0));
x=rand()%100;
}
cout<<"随机产生的数据为:";
q=head->next; //输出随机产生的链表
while(q!=NULL)
{
cout<<q->data<<" ";
q=q->next;
}
cout<<endl;
int m,k=0,num=0; //查找m这个数是否在这个链表中并且出现了几次
cout<<"请输入您要查找的数:";
cin>>m;
//查找用户输入的数是否在随机产生的链表里
j=head->next;
while(j!=NULL)
{
k++;
if(j->data==m)
{
cout<<"找到"<<j->data<<"是第"<<k<<"个"<<endl;
num++;
}
j=j->next;
}
cout<<"共找到"<<num<<"个"<<endl;
if(0==num)
{
cout<<"查无此数!"<<endl;
cout<<"没有数要删除!"<<endl;
}
//询问用户是否进行删除操作
else
{
cout<<"是否删除这些数y?";
char ch,ch1='Y',ch2='y';
cin>>ch;
if(ch1==ch||ch2==ch)
{
do
{
a=head;
q=head->next;
while((q!=NULL)&&(q->data!=m))
{
a=q;
q=q->next;
}
if(q==NULL)
cout<<"已删除完毕!"<<endl;
else
{
a->next=q->next;
delete (q);
}
}while(q!=NULL);
//删除后输出删除后的数组
cout<<"删除这些数后的链表为:";
q=head->next;
while(q!=NULL)
{
cout<<q->data<<" ";
q=q->next;
}
cout<<endl;
}
else
cout<<"你选择了不删除这些数!"<<endl;
}
}
2.用栈进行二进制转换
该模块要求用户输入一个正整数然后程序会用栈来存储所得到的二进制,然后在出栈输出十进制对应的二进制。
typedef struct linkstack
{
int data;
linkstack *next;
}Linkstack;
Linkstack *inistack(linkstack *top) //栈的初始化{
top=new linkstack;
top->next=NULL;
return top;
}
Linkstack *push(linkstack *top,int x) //进栈
{
linkstack *s=new linkstack;
s->data=x;
s->next=top->next;
top->next=s;
return top;
}
Linkstack *quit(linkstack *top) //退栈
{
linkstack *s=top->next;
if(s!=NULL)
{
top->next=s->next;
delete s;
}
return top;
}
int gettop(linkstack *top) //取栈顶元素
{
if(top->next!=NULL)
return(top->next->data);
else
return NULL;
}
int empty(linkstack *top)
{
if(top->next==NULL)
return 1;
else
return 0;
}
void tenTotwo(int n) //十进制转换为二进制
int x;
linkstack *top=NULL;
top=inistack(top); //栈的初始化
while(n!=0)
{
int j=n%2;
top=push(top,j); //进栈
n=n/2;
}
while(!empty(top)) //判断栈非空
{
x=gettop(top); //取栈顶元素
cout<<x;
top=quit(top); //退栈
}
cout<<endl;
}
void main()
{
int n;
cout<<"请输入十进制正整数:";
cin>>n;
cout<<"十进制数"<<n<<"的二进制为";
tenTotwo(n);
}
3.创建一个十字链表
用户输入十字链表所对应的三元数组程序输出输入的十字链表
typedef struct OLNode
{
int row,col;
union
{
struct OLNode *next; //表头结点next
int value; //元素结点value
}uval;
struct OLNode *down,*right;
}pOlink;
OLNode *setlink() //建立稀疏矩阵的十字链表
int m,n,len,s,row,col,value;
pOlink *p,*q,*a[100],*hm;
cout<<"请输入行数、列数以及非零元的个数\n";
cin>>m>>n>>len;
if(m>n)
s=m;
else
s=n;
hm=new pOlink;
hm->row=m;
hm->col=n;
a[0]=hm;
for(row=1;row<=s;row++)
{
p=new pOlink;
p->row=0;
p->col=0;
p->down=p;
p->right=p;
a[row]=p;
a[row-1]->uval.next=p;
}
a[s]->uval.next=hm;
for(int x=1;x<=len;x++)
{
cout<<"请输入一个三元组(row,col,value)"<<endl;
cin>>row>>col>>value; //输入一个三元组
//生成一个三元组结点
p=new pOlink;
p->row=row;
p->col=col;
p->uval.value=value;
//将p插入第row链表中
q=a[row];
while((q->down!=a[row])&&(q->down->col<col))
q=q->down;
p->down=q->down;
q->down=p;
//将p插到第col列链表中
q=a[col];
while((q->right!=a[col])&&(q->right->row<row))
q=q->right;
p->right=q->right;
q->right=p;
}
return hm;
}
void main()
{
pOlink *p,*q;
pOlink *hm=NULL;
hm=setlink();
cout<<"十字链表为"<<endl;
p=hm->uval.next;
while(p->uval.next!=hm->uval.next)
{
q=p->down;
while(q!=p)
{
cout<<"("<<q->row<<" "<<q->col<<" "<<q->uval.value<<")";
q=q->down;
}
cout<<endl;
p=p->uval.next;
}
}
五、程序的测试
为保证程序的正确性或存在较少Bug,需要进行各种测试。
针对各个功能模块,逐一给出测试内容、方案、结论如下:
1.链表操作:产生链表、查找、删除
1)测试内容
根据该模块的功能、输入输出、参数等,需要测试以下内容:
●产生链表:输入一个int型整数产生所对应元素的个数。
●查找:输入一个数查找是否存在于随机产生的元素中。
●若找到有则询问是否删除。
2)测试方案
2.用栈进行二进制转换
1)测试内容
●输入一个十进制整数输出转换后的二进制数
2)测试方案
3.创建十字链表
1)测试内容
●输入十字链表所对应的三元数组然后输出用三元数组表示的矩阵
2)测试方案
六、收获与建议
1.我的收获
●数据结构方面收获
最初做链表是都是直接写程序根本没有考虑到结构的可读性与美观一直就继续往
下写,但到后来注意到这个问题以后才开始懂得使用函数调用。
●算法设计方面收获
最初看到十字链表时根本就无从下手,特别是十字链表的最外的一行一列不知道怎
样初始化,但是通过这次实际查阅资料编写以后对这个有了一定的认识。
●编程技术方面收获
学习C++这么久以来就没有用过struct,也不知道怎样用但是这次的编程基本上都
用到了它,着用加深了我对C++知识的运用。
2.我的建议
无。