#include
#include
typedef struct Node{
int data;
Node* link;
}NODE;
typedef struct List{
NODE* first;
NODE* last;
}LIST;
void Init(LIST &l){
l.first = l.last = NULL;
}
NODE* GetNode(int x){
NODE* p;
p = (NODE*)malloc(sizeof(NODE));
if (p==NULL){
printf("Khong du bo nho!"); return NULL;
}
p->data = x;
p->link = NULL;
return p;
}
void AddLast(LIST &l, NODE* new_ele){
if (l.first==NULL){
l.first = new_ele;
l.last = l.first;
}
else {
l.last->link = new_ele;
l.last = new_ele;
}
}
NODE* InsertLast(LIST &l, int x){
NODE* new_ele = GetNode(x);
if (new_ele == NULL){
return NULL;
}
AddLast(l,new_ele);
return new_ele;
}
void AddNumber(LIST &l, int a[], int n){
NODE *p;
for (int i=0; idata);
p = p->link;
}
printf("\n");
}
void DistributeList(LIST &l, LIST &l1, LIST &l2){
NODE *p;
do{
p = l.first;
l.first = p->link; p->link = NULL;
AddLast(l1,p);
}while((l.first)&&(p->datadata));
if (l.first)
DistributeList(l,l2,l1);
else
l.last = NULL;
}
void MergeList(LIST &l, LIST &l1, LIST &l2){
NODE* p;
while ((l1.first)&&(l2.first)){
if (l1.first->datadata){
p = l1.first;
l1.first = p->link;
}
else{
p = l2.first;
l2.first = p->link;
}
p->link = NULL;
AddLast(l,p);
};
if (l1.first){
l.last->link = l1.first;
l.last = l1.last;
}
else if (l2.first){
l.last->link = l2.first;
l.last = l2.last;
}
}
void NaturalMergeSort(LIST &l){
LIST l1, l2;
if (l.first == l.last) return;
Init(l1);
Init(l2);
DistributeList(l,l1,l2);
NaturalMergeSort(l1);
NaturalMergeSort(l2);
MergeList(l,l1,l2);
}
int main(){
LIST l;
Init(l);
int a[] = {12,2,8,5,1,6,4,15};
int n = sizeof(a)/sizeof(a[0]);
AddNumber(l,a,n);
ShowNumber(l);
NaturalMergeSort(l);
ShowNumber(l);
}
Когда я запускаю его, код сообщает об ошибке прямо в этой строке
Здесь сегментация
Код по-прежнему работает нормально при отладке, но когда я вхожу в NaturalMergeSort в функции DistributeList я обнаружил ошибку сегментации в строке AddLast(l1,p).
Это то, что я получил в терминале, когда пытался запустить :
Мой терминал
Я пытался это исправить, но эта ошибка постоянно возникает, пожалуйста, помогите мне ее исправить.
Это мой код SLL Natural Merge Sort на C++: [code]#include #include typedef struct Node{ int data; Node* link; }NODE; typedef struct List{ NODE* first; NODE* last; }LIST; void Init(LIST &l){ l.first = l.last = NULL; } NODE* GetNode(int x){ NODE* p; p = (NODE*)malloc(sizeof(NODE)); if (p==NULL){ printf("Khong du bo nho!"); return NULL; } p->data = x; p->link = NULL; return p; }
void AddLast(LIST &l, NODE* new_ele){ if (l.first==NULL){ l.first = new_ele; l.last = l.first; } else { l.last->link = new_ele; l.last = new_ele; } } NODE* InsertLast(LIST &l, int x){ NODE* new_ele = GetNode(x); if (new_ele == NULL){ return NULL; } AddLast(l,new_ele); return new_ele; } void AddNumber(LIST &l, int a[], int n){ NODE *p; for (int i=0; idata); p = p->link; } printf("\n"); } void DistributeList(LIST &l, LIST &l1, LIST &l2){ NODE *p; do{ p = l.first; l.first = p->link; p->link = NULL;
AddLast(l1,p); }while((l.first)&&(p->datadata)); if (l.first) DistributeList(l,l2,l1); else l.last = NULL; } void MergeList(LIST &l, LIST &l1, LIST &l2){ NODE* p; while ((l1.first)&&(l2.first)){ if (l1.first->datadata){ p = l1.first; l1.first = p->link; } else{ p = l2.first; l2.first = p->link; } p->link = NULL; AddLast(l,p); }; if (l1.first){ l.last->link = l1.first; l.last = l1.last; } else if (l2.first){ l.last->link = l2.first; l.last = l2.last; } } void NaturalMergeSort(LIST &l){ LIST l1, l2; if (l.first == l.last) return; Init(l1); Init(l2); DistributeList(l,l1,l2); NaturalMergeSort(l1); NaturalMergeSort(l2); MergeList(l,l1,l2); } int main(){ LIST l; Init(l); int a[] = {12,2,8,5,1,6,4,15}; int n = sizeof(a)/sizeof(a[0]); AddNumber(l,a,n); ShowNumber(l); NaturalMergeSort(l); ShowNumber(l); } [/code] Когда я запускаю его, код сообщает об ошибке прямо в этой строке Здесь сегментация Код по-прежнему работает нормально при отладке, но когда я вхожу в NaturalMergeSort в функции DistributeList я обнаружил ошибку сегментации в строке AddLast(l1,p). Это то, что я получил в терминале, когда пытался запустить : Мой терминал Я пытался это исправить, но эта ошибка постоянно возникает, пожалуйста, помогите мне ее исправить.