user-0 提问: 数据结构-关于删除一递增序列中符合条件的元素，程序运行一半不动了，不知道哪里出了问题，求助！！

回复:
user: user-1
content: 引用 5 楼  的回复:[quote=引用 3 楼 自信男孩 的回复:][quote=引用 2 楼  的回复:][quote=引用 1 楼 自信男孩 的回复:]#include <stdio.h> #include <stdlib.h>  typedef struct Lnode  //定义单链表存储结构 {     int data;     struct Lnode *next; }Lnode, *linklist;  void CreatList(linklist *L,int num[])  //创建链表 {     (*L)=(linklist)malloc(sizeof(Lnode)); //建立带头结点的单链表     if(!(*L))         exit(1);     (*L)->next=NULL;      int i=0;     linklist p,q = *L;      while(num[i]!=-1)  //数据时以-1为结束标志     {         p=(Lnode*)malloc(sizeof(Lnode));         p->data=num[i];         q->next=p;         p->next=NULL;         q=p;         i++;     } }  void chushu(linklist L) {     linklist r=L;     r=r->next;     while(r!=NULL)     {         printf("%d  ",r->data);         r=r->next;     } } int ListDelete_L(linklist L,int mink,int maxk) //删除满足条件的结点 {     linklist p,q;     p = L->next;     q = L;     if(!p) {         printf("ERROR!链表为空！");         exit(0);     } #if 1     while (p) {         if (p->data > mink && p->data < maxk) {             q->next = p->next;             free(p);             p = q->next;          } else {             q = p;             p = p->next;         }     } #else     while(p!=NULL)     {         if((p->data)>mink&&p->data<maxk)  //data值大于mink小于maxk，进行删除         {             q->next=p->next;             free(p);             p=q->next;         }         else         {             q=p;             p=p->next;             //break;         }      } #endif      return 1; }  int main() {     int num[12]={0,2,3,6,13,21,33,37,45,66,99,-1};     int i;     printf("原序列：");     for(i=0;i<11;i++)         printf("%d ",num[i]);     int mink=0,maxk=0;     printf("\n请输入删除元素下界mink：\n");     scanf("%d,",&mink);     printf("请输入删除元素上界maxk：\n");     scanf("%d,",&maxk);     linklist L;     CreatList(&L,num);     ListDelete_L(L,mink,maxk);     linklist p=L;     p=p->next;     printf("现序列：");     while(p!=NULL)     {         printf("%d  ",p->data);         p=p->next;     } } 供参考～ 请问加的if else 是什么意思呢？还有把while循环再多加一遍？？ 希望解释一下！谢谢！！[/quote]  不是，而是根据我的理解去写这个逻辑，发现和你的差不多，就差一个break[/quote]  但是break不是结束本次循环的作用吗？？为什么差一个break错这么多啊， 现在想想觉得有没有break，这个循环运行不应该是一样的吗？？有点想不通了又。[/quote]  break是跳出循环，不是“结束本次循环”还有几个循环，不就是一层循环吗？怎么还有本次循环？

user: user-0
content: 引用 3 楼 自信男孩 的回复:[quote=引用 2 楼  的回复:][quote=引用 1 楼 自信男孩 的回复:]#include <stdio.h> #include <stdlib.h>  typedef struct Lnode  //定义单链表存储结构 {     int data;     struct Lnode *next; }Lnode, *linklist;  void CreatList(linklist *L,int num[])  //创建链表 {     (*L)=(linklist)malloc(sizeof(Lnode)); //建立带头结点的单链表     if(!(*L))         exit(1);     (*L)->next=NULL;      int i=0;     linklist p,q = *L;      while(num[i]!=-1)  //数据时以-1为结束标志     {         p=(Lnode*)malloc(sizeof(Lnode));         p->data=num[i];         q->next=p;         p->next=NULL;         q=p;         i++;     } }  void chushu(linklist L) {     linklist r=L;     r=r->next;     while(r!=NULL)     {         printf("%d  ",r->data);         r=r->next;     } } int ListDelete_L(linklist L,int mink,int maxk) //删除满足条件的结点 {     linklist p,q;     p = L->next;     q = L;     if(!p) {         printf("ERROR!链表为空！");         exit(0);     } #if 1     while (p) {         if (p->data > mink && p->data < maxk) {             q->next = p->next;             free(p);             p = q->next;          } else {             q = p;             p = p->next;         }     } #else     while(p!=NULL)     {         if((p->data)>mink&&p->data<maxk)  //data值大于mink小于maxk，进行删除         {             q->next=p->next;             free(p);             p=q->next;         }         else         {             q=p;             p=p->next;             //break;         }      } #endif      return 1; }  int main() {     int num[12]={0,2,3,6,13,21,33,37,45,66,99,-1};     int i;     printf("原序列：");     for(i=0;i<11;i++)         printf("%d ",num[i]);     int mink=0,maxk=0;     printf("\n请输入删除元素下界mink：\n");     scanf("%d,",&mink);     printf("请输入删除元素上界maxk：\n");     scanf("%d,",&maxk);     linklist L;     CreatList(&L,num);     ListDelete_L(L,mink,maxk);     linklist p=L;     p=p->next;     printf("现序列：");     while(p!=NULL)     {         printf("%d  ",p->data);         p=p->next;     } } 供参考～ 请问加的if else 是什么意思呢？还有把while循环再多加一遍？？ 希望解释一下！谢谢！！[/quote]  不是，而是根据我的理解去写这个逻辑，发现和你的差不多，就差一个break[/quote]  但是break不是结束本次循环的作用吗？？为什么差一个break错这么多啊， 现在想想觉得有没有break，这个循环运行不应该是一样的吗？？有点想不通了又。

user: user-0
content: 引用 3 楼 自信男孩 的回复:[quote=引用 2 楼  的回复:][quote=引用 1 楼 自信男孩 的回复:]#include <stdio.h> #include <stdlib.h>  typedef struct Lnode  //定义单链表存储结构 {     int data;     struct Lnode *next; }Lnode, *linklist;  void CreatList(linklist *L,int num[])  //创建链表 {     (*L)=(linklist)malloc(sizeof(Lnode)); //建立带头结点的单链表     if(!(*L))         exit(1);     (*L)->next=NULL;      int i=0;     linklist p,q = *L;      while(num[i]!=-1)  //数据时以-1为结束标志     {         p=(Lnode*)malloc(sizeof(Lnode));         p->data=num[i];         q->next=p;         p->next=NULL;         q=p;         i++;     } }  void chushu(linklist L) {     linklist r=L;     r=r->next;     while(r!=NULL)     {         printf("%d  ",r->data);         r=r->next;     } } int ListDelete_L(linklist L,int mink,int maxk) //删除满足条件的结点 {     linklist p,q;     p = L->next;     q = L;     if(!p) {         printf("ERROR!链表为空！");         exit(0);     } #if 1     while (p) {         if (p->data > mink && p->data < maxk) {             q->next = p->next;             free(p);             p = q->next;          } else {             q = p;             p = p->next;         }     } #else     while(p!=NULL)     {         if((p->data)>mink&&p->data<maxk)  //data值大于mink小于maxk，进行删除         {             q->next=p->next;             free(p);             p=q->next;         }         else         {             q=p;             p=p->next;             //break;         }      } #endif      return 1; }  int main() {     int num[12]={0,2,3,6,13,21,33,37,45,66,99,-1};     int i;     printf("原序列：");     for(i=0;i<11;i++)         printf("%d ",num[i]);     int mink=0,maxk=0;     printf("\n请输入删除元素下界mink：\n");     scanf("%d,",&mink);     printf("请输入删除元素上界maxk：\n");     scanf("%d,",&maxk);     linklist L;     CreatList(&L,num);     ListDelete_L(L,mink,maxk);     linklist p=L;     p=p->next;     printf("现序列：");     while(p!=NULL)     {         printf("%d  ",p->data);         p=p->next;     } } 供参考～ 请问加的if else 是什么意思呢？还有把while循环再多加一遍？？ 希望解释一下！谢谢！！[/quote]  不是，而是根据我的理解去写这个逻辑，发现和你的差不多，就差一个break[/quote] 确实是break的问题哈，删了之后正常了。非常感谢！！！！

user: user-1
content: 引用 2 楼  的回复:[quote=引用 1 楼 自信男孩 的回复:]#include <stdio.h> #include <stdlib.h>  typedef struct Lnode  //定义单链表存储结构 {     int data;     struct Lnode *next; }Lnode, *linklist;  void CreatList(linklist *L,int num[])  //创建链表 {     (*L)=(linklist)malloc(sizeof(Lnode)); //建立带头结点的单链表     if(!(*L))         exit(1);     (*L)->next=NULL;      int i=0;     linklist p,q = *L;      while(num[i]!=-1)  //数据时以-1为结束标志     {         p=(Lnode*)malloc(sizeof(Lnode));         p->data=num[i];         q->next=p;         p->next=NULL;         q=p;         i++;     } }  void chushu(linklist L) {     linklist r=L;     r=r->next;     while(r!=NULL)     {         printf("%d  ",r->data);         r=r->next;     } } int ListDelete_L(linklist L,int mink,int maxk) //删除满足条件的结点 {     linklist p,q;     p = L->next;     q = L;     if(!p) {         printf("ERROR!链表为空！");         exit(0);     } #if 1     while (p) {         if (p->data > mink && p->data < maxk) {             q->next = p->next;             free(p);             p = q->next;          } else {             q = p;             p = p->next;         }     } #else     while(p!=NULL)     {         if((p->data)>mink&&p->data<maxk)  //data值大于mink小于maxk，进行删除         {             q->next=p->next;             free(p);             p=q->next;         }         else         {             q=p;             p=p->next;             //break;         }      } #endif      return 1; }  int main() {     int num[12]={0,2,3,6,13,21,33,37,45,66,99,-1};     int i;     printf("原序列：");     for(i=0;i<11;i++)         printf("%d ",num[i]);     int mink=0,maxk=0;     printf("\n请输入删除元素下界mink：\n");     scanf("%d,",&mink);     printf("请输入删除元素上界maxk：\n");     scanf("%d,",&maxk);     linklist L;     CreatList(&L,num);     ListDelete_L(L,mink,maxk);     linklist p=L;     p=p->next;     printf("现序列：");     while(p!=NULL)     {         printf("%d  ",p->data);         p=p->next;     } } 供参考～ 请问加的if else 是什么意思呢？还有把while循环再多加一遍？？ 希望解释一下！谢谢！！[/quote]  不是，而是根据我的理解去写这个逻辑，发现和你的差不多，就差一个break

user: user-0
content: 引用 1 楼 自信男孩 的回复:#include <stdio.h> #include <stdlib.h>  typedef struct Lnode  //定义单链表存储结构 {     int data;     struct Lnode *next; }Lnode, *linklist;  void CreatList(linklist *L,int num[])  //创建链表 {     (*L)=(linklist)malloc(sizeof(Lnode)); //建立带头结点的单链表     if(!(*L))         exit(1);     (*L)->next=NULL;      int i=0;     linklist p,q = *L;      while(num[i]!=-1)  //数据时以-1为结束标志     {         p=(Lnode*)malloc(sizeof(Lnode));         p->data=num[i];         q->next=p;         p->next=NULL;         q=p;         i++;     } }  void chushu(linklist L) {     linklist r=L;     r=r->next;     while(r!=NULL)     {         printf("%d  ",r->data);         r=r->next;     } } int ListDelete_L(linklist L,int mink,int maxk) //删除满足条件的结点 {     linklist p,q;     p = L->next;     q = L;     if(!p) {         printf("ERROR!链表为空！");         exit(0);     } #if 1     while (p) {         if (p->data > mink && p->data < maxk) {             q->next = p->next;             free(p);             p = q->next;          } else {             q = p;             p = p->next;         }     } #else     while(p!=NULL)     {         if((p->data)>mink&&p->data<maxk)  //data值大于mink小于maxk，进行删除         {             q->next=p->next;             free(p);             p=q->next;         }         else         {             q=p;             p=p->next;             //break;         }      } #endif      return 1; }  int main() {     int num[12]={0,2,3,6,13,21,33,37,45,66,99,-1};     int i;     printf("原序列：");     for(i=0;i<11;i++)         printf("%d ",num[i]);     int mink=0,maxk=0;     printf("\n请输入删除元素下界mink：\n");     scanf("%d,",&mink);     printf("请输入删除元素上界maxk：\n");     scanf("%d,",&maxk);     linklist L;     CreatList(&L,num);     ListDelete_L(L,mink,maxk);     linklist p=L;     p=p->next;     printf("现序列：");     while(p!=NULL)     {         printf("%d  ",p->data);         p=p->next;     } } 供参考～ 请问加的if else 是什么意思呢？还有把while循环再多加一遍？？ 希望解释一下！谢谢！！

user: user-1
content: #include <stdio.h> #include <stdlib.h>  typedef struct Lnode  //定义单链表存储结构 {     int data;     struct Lnode *next; }Lnode, *linklist;  void CreatList(linklist *L,int num[])  //创建链表 {     (*L)=(linklist)malloc(sizeof(Lnode)); //建立带头结点的单链表     if(!(*L))         exit(1);     (*L)->next=NULL;      int i=0;     linklist p,q = *L;      while(num[i]!=-1)  //数据时以-1为结束标志     {         p=(Lnode*)malloc(sizeof(Lnode));         p->data=num[i];         q->next=p;         p->next=NULL;         q=p;         i++;     } }  void chushu(linklist L) {     linklist r=L;     r=r->next;     while(r!=NULL)     {         printf("%d  ",r->data);         r=r->next;     } } int ListDelete_L(linklist L,int mink,int maxk) //删除满足条件的结点 {     linklist p,q;     p = L->next;     q = L;     if(!p) {         printf("ERROR!链表为空！");         exit(0);     } #if 1     while (p) {         if (p->data > mink && p->data < maxk) {             q->next = p->next;             free(p);             p = q->next;          } else {             q = p;             p = p->next;         }     } #else     while(p!=NULL)     {         if((p->data)>mink&&p->data<maxk)  //data值大于mink小于maxk，进行删除         {             q->next=p->next;             free(p);             p=q->next;         }         else         {             q=p;             p=p->next;             //break;         }      } #endif      return 1; }  int main() {     int num[12]={0,2,3,6,13,21,33,37,45,66,99,-1};     int i;     printf("原序列：");     for(i=0;i<11;i++)         printf("%d ",num[i]);     int mink=0,maxk=0;     printf("\n请输入删除元素下界mink：\n");     scanf("%d,",&mink);     printf("请输入删除元素上界maxk：\n");     scanf("%d,",&maxk);     linklist L;     CreatList(&L,num);     ListDelete_L(L,mink,maxk);     linklist p=L;     p=p->next;     printf("现序列：");     while(p!=NULL)     {         printf("%d  ",p->data);         p=p->next;     } } 供参考～