这个双向循环链表为什么不能输出,但是把输出的子函数中p-< next>改成p= p-<>pre就可以输出>


 
#include"stdio.h"
#include"stdlib.h"
typedef struct linklist
{
    int date;
    linklist *next,*pre;
 } linklist;
  void csh(linklist **head)
  {
      *head=new linklist;
      (*head)->next=(*head)->pre=(*head);
  }
  void cread(linklist *head,int n)
  {
      linklist *p,*q=head; 
    printf("请输入链表内容\n"); 
      while(n--)
      {
      p=new linklist;
    scanf("%d",&p->date);
    q->next=p;
    p->pre=q;
    q->next=head;//尾插法 
    head->pre=p;
    q=p;//p用于记录头结点前一个结点 
       } 
  }
  void printflinklist(linklist *head)
  {
      linklist *p=head->next;
      while(p!=head)
      {
          printf("%d\t",p->date);
          p=p->next;
      }
   } 
 int main()
 {
     linklist *head;
     int n;
     printf("请输入链表长度\n");
     scanf("%d",&n);
    csh(&head);
    cread(head,n);
    printflinklist(head); 
  }

修改处见注释,供参考:

#include"stdio.h"
#include"stdlib.h"
typedef struct linklist
{
    int date;
    linklist *next,*pre;
 } linklist;
void csh(linklist **head)
{
    *head=new linklist;
    (*head)->next=(*head)->pre=(*head);
}
void cread(linklist *head,int n)
{
    linklist *p,*q=head;
    printf("请输入链表内容\n");
    while(n--)
    {
      p=new linklist;
      scanf("%d",&p->date);
      q->next=p;
      p->pre=q;
      p->next=head;//尾插法  q->next=head;修改
      head->pre=p;
      q=p;//p用于记录头结点前一个结点
    }
}
void printflinklist(linklist *head)
{
      linklist *p=head->next;
      while(p!=head)
      {
          printf("%d\t",p->date);
          p=p->next;
      }
      printf("\n");
      p = head->pre;   //修改
      while(p != head)
      {
          printf("%d\t",p->date);
          p=p->pre;
      }
      printf("\n");
}
int main()
{
    linklist *head;
    int n;
    printf("请输入链表长度\n");
    scanf("%d",&n);
    csh(&head);
    cread(head,n);
    printflinklist(head);
    return 0;
}