C++链表不能自动增加长度?


#include<bits/stdc++.h>//万能文件头 

using namespace std;

//创建一个结构体表示链表的结点类型
struct node
{
    int data;    //存放链表中的数据 
    struct node *next;    //存放该数据的后向指针 
};                      //别忘了;哦 

int main() {
    struct node *head,*p,*q,*t; //定义一系列结构体的后向指针 
    int i,n,a,number;
    cin>>n;
    head=NULL;  //头指针初始为空
    for(i=1;i<+n;i++)   //循环输入n个数
    {
        cin>>number;        
        //动态申请一个空间,用来存放一个结点,并用临时指针p指向这个结点 
        p=(struct node *)malloc(sizeof(struct node));  //内存中动态分配结构体指定大小的存储空间,molloc函数用于动态分配内存
        p->data=number;   //将数据存入当前结点的data域中
        p->next=NULL;  //设置当前结点的后向指针为空,也表明当前结点的下一个结点为空
        if(head==NULL)
           head=p; //如果这是第一个创建的结点,则将头指针指向这个结点
        else
           q->next=p; //若不是第一个结点,则将上一个结点的后继指针指向当前结点
           q=p; //指针q也指向当前结点,q代表当前的最后一个结点的指针 } 
cin.sync();
cin>>a;  //读入待插入的数

t=head;  //从表的头部开始遍历
while(t!=NULL)  //当没有达到表尾部的时候循环
{
    if(t->next->data > a) //如果当前结点的下一个结点的值大于待插入的数 ,则将数插入
    {
        p=(struct node *)malloc(sizeof(struct node)); //动态申请一个空间,用来存放新增的结点 
        p->data=a;
        p->next=t->next; //新增结点的后继指针指向当前结点的后继zhizhen
        t->next=p;  //当前结点的后继指针指向新增结点的后继指针
        break;  //插入完毕,退出循环
         
    } 
    t=t->next; //继续下一个结点 
} 
  //输出链表中的所有数
  t=head;
  while(t!=NULL) 
  {
      cout<<t->data<<" ";
      t=t->next;  //继续下一个结点 
  }
  
return 0;
}
  • 存在问题:链表长度不能自动增长

编译结果如下:

img

链表肯定是能增加长度的啊,不然还有啥用
循环插入节点整个节奏都有问题,修改如下:

#include<bits/stdc++.h>//万能文件头 
 
using namespace std;

//创建一个结构体表示链表的结点类型
struct node
{
    int data;    //存放链表中的数据 
    struct node *next;    //存放该数据的后向指针 
};                      //别忘了;哦 

int main() 
{
    struct node *head,*p,*q,*t; //定义一系列结构体的后向指针 
    int i,n,a,number;
    cin>>n;
    head=NULL;  //头指针初始为空
    for(i=0;i<n;i++)   //循环输入n个数
    {
        cin>>number;        
        //动态申请一个空间,用来存放一个结点,并用临时指针p指向这个结点 
        p=(struct node *)malloc(sizeof(struct node));  //内存中动态分配结构体指定大小的存储空间,molloc函数用于动态分配内存
        p->data=number;   //将数据存入当前结点的data域中
        p->next=NULL;  //设置当前结点的后向指针为空,也表明当前结点的下一个结点为空
        if(head==NULL)
            head=p; //如果这是第一个创建的结点,则将头指针指向这个结点
        else
            q->next=p; //若不是第一个结点,则将上一个结点的后继指针指向当前结点
        q=p; //指针q也指向当前结点,q代表当前的最后一个结点的指针 
    } 
    cin>>a;  //读入待插入的数

    if(head->data > a)
    {
        p=(struct node *)malloc(sizeof(struct node)); //动态申请一个空间,用来存放新增的结点 
        p->data=a;
        p->next = head;
        head = p;
    }
    else
    {
        t=head;  //从表的头部开始遍历
        while(t->next!=NULL)  //当没有达到表尾部的时候循环
        {
            if(t->next->data > a) //如果当前结点的下一个结点的值大于待插入的数 ,则将数插入
            {
                p=(struct node *)malloc(sizeof(struct node)); //动态申请一个空间,用来存放新增的结点 
                p->data=a;
                p->next=t->next; //新增结点的后继指针指向当前结点的后继zhizhen
                t->next=p;  //当前结点的后继指针指向新增结点的后继指针
                break;  //插入完毕,退出循环

            } 
            t=t->next; //继续下一个结点
        } 
        if(t->next == NULL)
        {
            p=(struct node *)malloc(sizeof(struct node)); //动态申请一个空间,用来存放新增的结点 
            p->data=a;
            p->next = NULL;
            t->next = p;
        }
    }
    //输出链表中的所有数
    t=head;
    while(t!=NULL) 
    {
        cout<<t->data<<" ";
        t=t->next;  //继续下一个结点 
    }

    return 0;
}


你t->next都没有判断是否为空你就使用t->next->data去比较,固然有可能会出错。