主题:[讨论]数据结构简单问题
#include<iostream>
#include<cstdlib>
#include<ctime>
#include<iomanip>
using namespace std;
class list
{
public:
int num,score;
char name[10];
class list *llink;
class list *rlink;
};
typedef class list node;
typedef node *link;
link findnode(link head,int num)
{
link ptr;
ptr=head;
while(ptr!=NULL)
{
if(ptr->num==num)
return ptr;
ptr=ptr->rlink;
}
return ptr;
}
link deletenode(link head,link del)
{
if(head==NULL)
{
cout<<"双向链表是空的"<<endl;
return NULL;
}
if(del==NULL)
{
cout<<"错误:不是表中的结点"<<endl;
return NULL;
}
if(del==head)//删除表头
{
head=head->rlink;
head->llink=NULL;
}
else
{
if(del->rlink==NULL)//删除表尾
del->llink->rlink=NULL;
else//删除中间结点
{
del->llink->rlink=del->rlink;
del->rlink->llink=del->llink;
}
}
free(del);
return head;
}
int main()
{
link head,ptr;
link llinknode=NULL;
link newnode=NULL;
int i,j,position=0,data[12][2];
char namedata[12][10]={{"Asf"},{"Sdsfs"},{"Sdgg"},{"Dgd"},
{"Dgff"},{"Dddf"},{"Fdfhf"},{"Rdfgd"},
{"Fhgm"},{"Qxvf"},{"Rgdf"},{"Tfd"}};
srand((unsigned)time(NULL));
cout<<"座位 成绩 座位 成绩 座位 成绩 座位 成绩"<<endl;
cout<<"=========================================="<<endl;
for(i=0;i<12;i++)
{
data[i][0]=i+1;
data[i][1]=rand()%50+51;
}
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
cout<<"["<<setw(2)<<data[j*3+i][0]<<"] ["
<<setw(3)<<data[j*3+i][1]<<"] ";
cout<<endl;
}
head=new node;//建立表头
if(!head)
{
cout<<"!!!!!!!!Error内存申请失败!!!!!!!!!!!"<<endl;
exit(1);
}
else
{
head->num=data[0][0];
for(j=0;j<10;j++)
head->name[j]=namedata[0][j];
head->score=data[0][1];
llinknode=head;
for(i=1;i<12;i++)
{
newnode=new node;
newnode->llink=NULL;
newnode->rlink=NULL;
newnode->num=data[i][0];
for(j=0;j<10;j++)
newnode->name[j]=namedata[i][j];
newnode->score=data[i][1];
llinknode->rlink=newnode;
llinknode=newnode;
}
}
while(1)
{
cout<<"请输入要删除的学生编号,结束输入-1 ";
cin>>position;
if(position==-1) break;
else
{
ptr=findnode(head,position);
head=deletenode(head,ptr);
}
}
cout<<endl<<"\t座位\t名字\t成绩"<<endl;
cout<<"\t============================="<<endl;
ptr=head;
while(ptr!=NULL)
{
cout<<"\t["<<setiosflags(ios::right)<<setw(2)<<ptr->num
<<"]\t[ "<<setiosflags(ios::left)<<setw(10)<<ptr->name
<<"]\t["<<setw(3)<<ptr->score<<"]"<<endl;
ptr=ptr->rlink;
}
system("pause");
return 0;
}
插入中间结点的时候出现了一点问题 。。。。。有谁能帮我解释一下吗。。。。急求[em10][em10][em10][em10][em10]
#include<cstdlib>
#include<ctime>
#include<iomanip>
using namespace std;
class list
{
public:
int num,score;
char name[10];
class list *llink;
class list *rlink;
};
typedef class list node;
typedef node *link;
link findnode(link head,int num)
{
link ptr;
ptr=head;
while(ptr!=NULL)
{
if(ptr->num==num)
return ptr;
ptr=ptr->rlink;
}
return ptr;
}
link deletenode(link head,link del)
{
if(head==NULL)
{
cout<<"双向链表是空的"<<endl;
return NULL;
}
if(del==NULL)
{
cout<<"错误:不是表中的结点"<<endl;
return NULL;
}
if(del==head)//删除表头
{
head=head->rlink;
head->llink=NULL;
}
else
{
if(del->rlink==NULL)//删除表尾
del->llink->rlink=NULL;
else//删除中间结点
{
del->llink->rlink=del->rlink;
del->rlink->llink=del->llink;
}
}
free(del);
return head;
}
int main()
{
link head,ptr;
link llinknode=NULL;
link newnode=NULL;
int i,j,position=0,data[12][2];
char namedata[12][10]={{"Asf"},{"Sdsfs"},{"Sdgg"},{"Dgd"},
{"Dgff"},{"Dddf"},{"Fdfhf"},{"Rdfgd"},
{"Fhgm"},{"Qxvf"},{"Rgdf"},{"Tfd"}};
srand((unsigned)time(NULL));
cout<<"座位 成绩 座位 成绩 座位 成绩 座位 成绩"<<endl;
cout<<"=========================================="<<endl;
for(i=0;i<12;i++)
{
data[i][0]=i+1;
data[i][1]=rand()%50+51;
}
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
cout<<"["<<setw(2)<<data[j*3+i][0]<<"] ["
<<setw(3)<<data[j*3+i][1]<<"] ";
cout<<endl;
}
head=new node;//建立表头
if(!head)
{
cout<<"!!!!!!!!Error内存申请失败!!!!!!!!!!!"<<endl;
exit(1);
}
else
{
head->num=data[0][0];
for(j=0;j<10;j++)
head->name[j]=namedata[0][j];
head->score=data[0][1];
llinknode=head;
for(i=1;i<12;i++)
{
newnode=new node;
newnode->llink=NULL;
newnode->rlink=NULL;
newnode->num=data[i][0];
for(j=0;j<10;j++)
newnode->name[j]=namedata[i][j];
newnode->score=data[i][1];
llinknode->rlink=newnode;
llinknode=newnode;
}
}
while(1)
{
cout<<"请输入要删除的学生编号,结束输入-1 ";
cin>>position;
if(position==-1) break;
else
{
ptr=findnode(head,position);
head=deletenode(head,ptr);
}
}
cout<<endl<<"\t座位\t名字\t成绩"<<endl;
cout<<"\t============================="<<endl;
ptr=head;
while(ptr!=NULL)
{
cout<<"\t["<<setiosflags(ios::right)<<setw(2)<<ptr->num
<<"]\t[ "<<setiosflags(ios::left)<<setw(10)<<ptr->name
<<"]\t["<<setw(3)<<ptr->score<<"]"<<endl;
ptr=ptr->rlink;
}
system("pause");
return 0;
}
插入中间结点的时候出现了一点问题 。。。。。有谁能帮我解释一下吗。。。。急求[em10][em10][em10][em10][em10]