程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> c語言-C語言問題 感覺自己是對的 但提交後總 Runtime error

c語言-C語言問題 感覺自己是對的 但提交後總 Runtime error

編輯:編程解疑
C語言問題 感覺自己是對的 但提交後總 Runtime error

描述:

已知a、b和c三個遞增有序的鏈表,現在要求對a做如下操作:刪除其中既即在b中出現又在c中出現的元素(注意同一表中的元素有可能重復)。

輸入:

先在第一行輸入3個小於100的正整數m,n,l分別表示鏈表a,b,c的長度,然後在第二行輸入m個遞增的正整數,第三行輸入n個遞增的正整數,第四行輸入l個遞增的正整數,分別為這三個鏈表的元素,

輸出:

按順序輸出刪除元素後的鏈表a的值,每個元素占一行。

輸入樣例:

3 8 5
23 47 88
2 5 7 9 47 47 88 99
10 20 30 40 47
輸出樣例:

23

88

我的代碼:(很多數據都試過了,都沒錯啊!!!)
#include
#include
typedef struct List{
int data;
int length;
struct List *next;
} List;
List *LA,*LB,*LC;

void CreateLink(List **L,int length)
{
List p,*s;
p=*L=(List *)malloc(sizeof(List));
(*L)->length=length;
for(;length>0;length--)
{
s=(List *)malloc(sizeof(List));
scanf("%d",&s->data);
p->next=s;
p=s;
}
p->next=NULL;
}
/*int GetLinkData(List *L,int n){
List *p;
int i=0;
p=L->next;
if(n> L->length -1) {
printf("輸入位置錯誤!\n");
return -1;
}
for(i=0;p!=NULL;i++){
if(i==n) return p->data;
p=p->next;
}
return 0;
}
/
int GetDataPosition(List *L,int value){
List *p;
int i=0;
p=L->next;
for(i=0;p!=NULL;i++){
if(p->data == value){
return i;
}
p=p->next;
}
return -1;
}
void DeleteLink(List *L,int n){
List *p = L->next;
List *s = L;
int i=0;
for(i=0;p!=NULL;i++){
if(i==n){
s->next=p->next;
free(p);
}
s=s->next;
p=p->next;
}

}

void PrintLink(List L)
{
List *p;
p=L->next;
while(p!=NULL)
{
printf("%d\n",p->data);
p=p->next;
}
}
/*void InsertLink(List *L,int insert){
List *p=L->next;
List *s=L;
List *p2=(List *)malloc(sizeof(List));
p2->data=insert;
while(p!=NULL){
if(p->data >= insert){
p2->next=p;
s->next=p2;
return;
}
s=s->next;
p=p->next;
}
s->next=p2;
p2->next=NULL;
}
/
void ProcessLink(List *L1,List *L2,List *L3){
int i=0,t1=0,t2=0,d=0;
List *p = L1->next;
for(i=0;p!=NULL;i++){
d=p->data;
// printf("p-data %d\n",d);
t1=GetDataPosition(L2,d);

// printf("在L2表中p-data的位置:%d\n",t1);
t2=GetDataPosition(L3,d);
// printf("在L3表中p-data的位置:%d\n",t2);
if(t1!=-1 && t2!=-1){
p=p->next;
DeleteLink(L1,i);
i--;
/*調試了好幾天啊,鏈表刪除一個節點之後總長度減一,如果i不自減,
因為GetDataPosition()都是每次遍歷查找的,DeleteLink(L1,i)將會
刪去你想要刪去的後面那個節點*/
continue;
}
p=p->next;
}
}
void DestroyList(List *L)
{
List *p,*q;
p=L;
while(p!=NULL)
{
q=p->next;
free(p);
p=q;
}
L=NULL;
}
int main()
{
// freopen("input.txt","r",stdin);
int l1=0,l2=0,l3=0;
scanf("%d",&l1);
scanf("%d",&l2);
scanf("%d",&l3);
CreateLink(&LA,l1);
CreateLink(&LB,l2);
CreateLink(&LC,l3);
// PrintLink(LA);
ProcessLink(LA,LB,LC);
PrintLink(LA);
DestroyList(LA);
DestroyList(LB);
DestroyList(LC);
return 0;
}

最佳回答:


 void DeleteLink(List *L,int n){
    List *p = L->next;
    List *s = L;
    int i=0;
    for(i=0;p!=NULL;i++){
        if(i==n){
            s->next=p->next;
            free(p); //這裡free p了,p就不能用了
        }
        s=s->next;
        p=p->next; 你還在訪問p->next
    }

}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved