关于链表的一些理解

#define NULL 0

struct student

long num;     

 float score;

 struct  student  *next;  

   };

main()

{

struct student a, b, c,   *head,    *p;

   a.num=99101; a.score=89.5;

   b. num=99103; b.score=90;

   c.num=99107 ; c.score=85;

    head=&a;     a.next=&b;     b.next=&c;      c.next=NULL;p=head; 

  do

 {  printf("%ld %5.1f\n",p->num,p->score);

      p=p->next;   }while(p!=NULL);  }

1.为什么在结构体内,结构体student  还没有定义好,而就在其内部使用呢?不是说先定义后使用的吗?”这时student这个类型可以使用,但是个不完全类型,只能以有限方式使用,不能定义该类型的对象,不完全类型只能用于定义指向该类型的指针及引用.就是说next指向了struct  student 类型的对象,但是具体只想谁并不知道。

2.struct student a, b, c,   *head,    *p 都是struct的具体对象,而next是struct的一个成员变量,next的类型是指向struct student结构体的指针型变量

3.指针对象指向成员时使用->:p->num,p->score,p->next

4.普通对象指向成员时使用,: a.next,a.num,a.score

3.因为next存放的是下一个对象的地址,p->next 是 p 所指向的结构的 next 成员,存放的是下一个对象的地址。p=p->next,就让p指向了下一个结点的数据。

c++版本简单链表程序

整体思路是:1.定义类成员的类型指针class list *next

                      2.定义类型别名与指针型别名,使用别名参与运算

                      3.定义指向链表头的指针,与类成员指针同类型,为delptr

                      4.定义指向当前节点的指针ptr

                      5.定义新的节点newnode

                      6.new分配内存,node* delptr=new node,此时delptr指向链表头,并为成员赋值

                     7.ptr=delptr;   //保留链表头指针,以ptr为指向当前节点的指针

                    8.创建新节点newnode,并分配内存,将此时newnode指向该节点,并为成员赋值

                    9.清空newnode的成员next中的指向 newnode->next=NULL,此时为孤立节点

                    10.建好头结点和孤立节点之后把孤立节点连接到链表后面ptr->next=newnode

                   11.ptr=ptr->next;     //让ptr保持在链表的最后面,ptr->next里存放的是下一个对象的地址,赋值给ptr即将指向对象向前移动一位。

                    12.最后还需释放空间delete,避免发生内存泄漏。

               

#include <iostream>
using namespace std;
class list
{
    public:
        int num,score;
       char name[10];
       class list *next;      //next指向了类list,next是一个指针,指向了另一个类实例,这样可以形成链表。
};
typedef class list node; //定义类型别名,将node定义为list的同义词
typedef node *link;        /将link定义为node*的同义词,link指向node。
int main()
{  
    link newnode,ptr,delptr     ; //声明三个链表结构的指针
    cout<<"请输入 5 位学生的数据:"<<endl;
    delptr=new node;   //delptr暂当链表头指针https://blog.csdn.net/xxpresent/article/details/53024555
    if (!delptr)
    {  
        cout<<"[Error!!内存分配失败!]"<<endl;
        exit(1);
    }
    cout<<"请输入座号:";
    cin>>delptr->num;
    cout<<"请输入姓名:";
    cin>>delptr->name;
    cout<<"请输入成绩:";
    cin>>delptr->score;
    ptr=delptr;   //保留链表头指针,以ptr为指向当前节点的指针
    for (int i=1;i<5;i++)
    {  
        newnode=new node;  //创建新节点
        if(!newnode)
        {  
            cout<<"[Error!!内存分配失败!"<<endl;
            exit(1);
        }
        cout<<"请输入座号:";
        cin>>newnode->num;
        cout<<"请输入姓名:";
        cin>>newnode->name;
        cout<<"请输入成绩:";
        cin>>newnode->score;
        newnode->next=NULL;
        ptr->next=newnode; //把新节点加在链表后面
        ptr=ptr->next;     //让ptr保持在链表的最后面
    }
    cout<<"\n  学  生  成  绩"<<endl;
    cout<<" 座号\t姓名\t成绩\n====================="<<endl;
    ptr=delptr;            //让ptr回到链表头
    while(ptr!=NULL)
    {  
        cout<<ptr->num<<"\t"<<ptr->name<<"\t"<<ptr->score<<endl;
        delptr=ptr;
        ptr=ptr->next;     //ptr按序往后遍历整个链表
        delete delptr;     //释放内存空间
    }
    system("pause");
}

猜你喜欢

转载自blog.csdn.net/konglingshneg/article/details/82765255