【链表】为什么用L->Next=NULL就出错

``````int Length(List L){//求链表长度
int i=0;
while(L){
L=L->Next;
i++;
}
L->Next=NULL;
return i;
}
``````

``````int Length(List L){
List p=L;
int i=0;
while(p){
p=p->Next;
i++;
}
L->Next=NULL;
return i;
}
``````

1个回答

while(L){
L=L->Next;
i++;
}

L->Next=NULL;

free释放链表内存总是出错，求高手指点！！

#include<iostream> #include<stdlib.h> #include<malloc.h> typedef char ElemType; typedef struct LNode{ ElemType data; struct LNode *next; }LNode , *LinkList , *CiList ; void CreateList( LinkList &L ,int n ) { LinkList p , q ; L = ( LinkList ) malloc ( sizeof ( LNode) ); L ->next = NULL ; q = L ; for ( int i=0 ; i < n ; i++) { p = ( LinkList ) malloc ( sizeof ( LNode) ); scanf( " %c", &p->data ); p->next = q->next ; q->next = p ; q = p ; } } void DipList ( LinkList L ) { LinkList p = L ; while ( p->next != NULL ) { p = p->next ; printf ( "%c", p->data); printf(" "); } } void Separate_List ( LinkList L , CiList &La ,CiList &Lb ,CiList &Lc ) { LNode *p,*q,*r,*s ; La = ( CiList ) malloc ( sizeof( LNode )); p = La ; Lb = ( CiList ) malloc ( sizeof( LNode )); q = Lb ; Lc = ( CiList ) malloc ( sizeof( LNode )); r = Lc ; s = L->next ; while ( s!= NULL ) { if ( s->data >= '0' && s->data <= '9') { p->next = s ; p = s ; s = s->next ; } if( s->data >= 'a' && s->data <= 'z') { q->next = s ; q = s ; s = s->next ; } else { r->next = s ; r = s ; s = s->next ; } } p->next = La ; q->next = Lb ; r->next = Lc ; } void main() { LinkList L; CiList La , Lb ,Lc ; int n ; printf( "请输入单链表长度:\n"); scanf("%d",&n); printf("请输入单链表元素:\n"); CreateList( L , n ); printf("输入的单链表为:\n"); DipList ( L ) ; Separate_List ( L , La ,Lb ,Lc ); printf("分离后的循环链表La为:\n"); DipList ( La ) ; printf("分离后的循环链表Lb为:\n"); DipList ( Lb ) ; printf("分离后的循环链表Lc为:\n"); DipList ( Lc ) ; } 到分离这个函数的时候就会出错 但是我自己检查自己的算法始终不知道错在哪 求指点 十分感谢！！

C++链表头指针位置不知为什么出错

c语言链表显示出错 求大佬帮忙

c语言运行出错 是链表哪里出错了吗

Lintcode 链表插入排序

C语言求教merge(struct node *p,struct node *q)哪里出错了？

#include "stdio.h" #include "stdlib.h" struct node { int data; struct node *next; }; struct node *creat(int *a) { struct node*h,*p,*q; int i; h=p=(struct node*)malloc(sizeof(struct node)); for(i=0;i<10;i++) { q=(struct node*)malloc(sizeof(struct node)); q->data=a[i]; p->next=q; p=q; } p->next=0; return h; } void output(struct node*h) { struct node*p; p=h->next; if(p==NULL) printf("The list is NULL!\n"); else { printf("\nHead"); while(p->next!=0) { printf("->%d",p->data); p=p->next; } printf("->End\n"); } } void merge(struct node *p,struct node *q) { struct node *s,*r; r=p; while(r->next!=NULL) { if(r->next->data<q->next->data) { s=r->next; r=s->next; s->next=r; r=s; r=r->next; } else if(r->next->data>q->next->data) { s=q->next; q->next=s->next; s->next=q; r->next=s; r=r->next; } else { r=r->next; s=q->next; q=q->next; free(s); } } if(q->next!=NULL) { r->next=q->next; free(q); } } void main() { struct node *p,*q; int a[10]={1,2,3,4,5,7,9,11,13,15}; int b[10]={1,2,3,4,5,8,10,12,14,16}; p=creat(a); printf("The first list before merging:\n"); output(p); q=creat(b); printf("The second list before merging:\n"); output(q); merge(p,q); printf("The list after merging:\n"); output(p); } ===C程序题：假设链表p和链表q中的结点值都是整数，且按结点值递增次序链接起来的带表头结点的单链表，在每个链表中，每个结点的值各不相同，但链表p和链表q可能有值相同的结点。下面函数将链表q合并到链表p中，使得合并后的链表仍为按结点值递增有序的单链表，且链表中每个结点的值各不相同。====求教void merge(struct node *p,struct node *q)哪里出错了，导致以上程序运行结果不对呢？

loonggg读完需要3分钟速读仅需 1 分钟大家好，我是你们的校长。我之前讲过，这年头，只要肯动脑，肯行动，程序员凭借自己的技术，赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

MySQL数据库面试题（2020最新版）

!大部分程序员只会写3年代码

HTTP与HTTPS的区别