這是題目要求:已知線性表中的元素以值遞增有序排列,并以單鏈表作存盤結構。試寫一高效演算法,洗掉表中所有值大于mink且小于maxk的元素(若表中存在這樣的元素)同時釋放被刪結點空間
#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=https://bbs.csdn.net/topics/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);
}
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;
}
}
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;
}
}

這是運行截圖,我用輸出調式了一下,好像是洗掉函式有點問題,
進行不下去,但不知道哪錯了,是邏輯上??還是語法上??
求大神指導!!謝謝謝謝!!!
uj5u.com熱心網友回復:
#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=https://bbs.csdn.net/topics/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;
}
}
供參考~
uj5u.com熱心網友回復:
請問加的if else 是什么意思呢?還有把while回圈再多加一遍??
希望解釋一下!謝謝!!
uj5u.com熱心網友回復:
不是,而是根據我的理解去寫這個邏輯,發現和你的差不多,就差一個break
uj5u.com熱心網友回復:
#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=https://bbs.csdn.net/topics/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回圈再多加一遍??
希望解釋一下!謝謝!!
不是,而是根據我的理解去寫這個邏輯,發現和你的差不多,就差一個break
確實是break的問題哈,刪了之后正常了。非常感謝!!!!
uj5u.com熱心網友回復:
#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=https://bbs.csdn.net/topics/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回圈再多加一遍??
希望解釋一下!謝謝!!
不是,而是根據我的理解去寫這個邏輯,發現和你的差不多,就差一個break
但是break不是結束本次回圈的作用嗎??為什么差一個break錯這么多啊,
現在想想覺得有沒有break,這個回圈運行不應該是一樣的嗎??有點想不通了又。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/238244.html
標籤:C語言
上一篇:C語言
