回 帖 发 新 帖 刷新版面

主题:[讨论]数据结构简单问题

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

回复列表 (共3个回复)

沙发

有谁能解释一下哇

板凳

回来看看,这个版块还是太冷清了。
既然lz意在指双向链表,那么构造的时候就得注意,lz所建的链表都是单向,而且llink左指针都是NULL,错误就在于对NULL指针的解引用。

构建双向链表时。
    head->llink = NULL;//这里加上
        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;
           newnode->llink  = llinknode; //这里加上
               llinknode=newnode; 
               
                
          }
        newnode->rlink = NULL; //这里加上
                newnode->llink = llinknode;//这里加上
    }
还有希望lz注意下命名,我一看还以为是构建二叉树呢。。

3 楼

感谢大虾。。。。。。希望大虾们来这个版块多逛逛啊。。。

我来回复

您尚未登录,请登录后再回复。点此登录或注册