Member 13673666 Ответов: 1

Как я могу решить свою проблему в приведенном ниже коде


#include <iostream>
using namespace std;
typedef struct node{
    public:
    struct node *column;
    bool flag;
    struct node *row;
    int ii,jj;
    union{
        int val;
        struct node *next;
    }u;
}nod,*ptr;
static ptr strt1;
static ptr strt2;
static ptr y;
int t;
int tt;

void AddLink(int i,int j){
    int count = 0;
    ptr q = strt2;
    ptr p = strt1;
    for (int k=0;k<i;k++){
        q = q->u.next;
    }
    for (int k=0;k<j;k++){
        p = p->u.next;
    }
    if (q->column==NULL && p->row==NULL){
        ptr m = (node *)malloc(sizeof(node));
        q->column = m;
        m->u.val = 1;
        m->column = q;
        m->ii = i;
        m->flag = false;
        p->row = m;
        m->row = p;
        m->jj= j;
        count =1;
    }
    if (q->column!=NULL && p->row ==NULL){
        ptr h=q;
        ptr w = q;
        q = q->column;
        while (q->jj<j&&q!=w){
            h =q;
            q = q->column;
        }
        ptr mm = (node *)malloc(sizeof(node));
        h->column = mm;
        mm->column = q;
        mm->ii = i;
        mm->u.val = 1;
        mm->flag = false;
        mm->jj = j;
        mm->row = p;
        count = 1;
        p->row = mm;
    }
    if (p->row!=NULL && q->column==NULL){
        ptr hh=p;
        ptr ww = p;
        p = p->row;
        while (p->ii<i&&p!=ww){
            hh =p;
            p = p->row;
        }
        ptr mmm = (node *)malloc(sizeof(node));
        hh->row = mmm;
        mmm->row = p;
        mmm->jj = j;
        mmm->u.val = 1;
        mmm->flag = false;
        mmm->ii = i;
        mmm->column = q;
        count = 1;
        q->column = mmm;
    }
    if (p->row!=NULL && q->column!=NULL && count==0){
        ptr hhh = p;
        ptr www = p;
        ptr g = q;
        ptr gg = q;
        q = q->column;
        p = p->row;
        while (q->jj<j&&q!=gg){
            g =q;
            q = q->column;
        }
        while ((p->ii)<i&&p!=www){
            hhh =p;
            p = p->row;
        }
        if (q->jj!=j && p->ii!=i){
            ptr mmmm = (node *)malloc(sizeof(node));
            hhh->row = mmmm;
            mmmm->row = p;
            g->column = mmmm;
            mmmm->column = q;
            mmmm->flag = false;
            mmmm->u.val = 1;
            mmmm->ii = i;
            mmmm->jj = j;
        }
        else{
            p->u.val +=1;
        }
    }
}
void DeleteLink(int i,int j){
    ptr q = strt2;
    ptr p = strt1;
    for (int k=0;k<i;k++){
        q = q->u.next;
    }
    ptr w =q;
    ptr g = q;
    q = q->column;
    while (g->jj<j&&q!=w){

        q = g->column;
        if (q->jj==j){
            q->u.val-=1;
        }
        g=q;
    }
}
int RetrieveValue(int i,int j){
    ptr q = strt2;
    ptr p = strt1;
    int c = 0;
    for (int k=0;k<i;k++){
        q = q->u.next;
    }
    ptr w =q;
    ptr g = q;
    q = q->column;
    while (g->jj<j&&q!=w){

        q = g->column;
        if (q->jj==j){
            c = q->u.val;
        }
        g=q;
    }
    return c;
}
int RetrieveRowSumUptoKthColumn(int i,int j){
    ptr p = strt1;
    int c=0;
    for (int k=0;k<i;k++){
        p = p->u.next;
    }
    ptr w = p;
    p = p->row;
    while (p->ii<=j&&p!=w){
        c+=p->u.val;
        p = p->row;
    }
    return c;
}
int RetrieveColumnSumUptoKthRow(int i,int j){
    ptr q=strt2;
    int c=0;
    for (int k=0;k<i;k++){
        q= q->u.next;
    }
    ptr w = q;
    q = q->column;
    while (q->jj<=j &&q!=w){
        c+=q->u.val;
        q = q->column;
    }
    return c;
}
int m;
int n;
ptr a;
ptr b;
int main(){


    a = (node *)malloc(sizeof(node));
    b = (node *)malloc(sizeof(node));
    strt1 = a;
    strt2 = b;
    cout<<a->u.next;
    cout<<a->column;
    cout<<a->row;
    for(int i=0;i<10000000;i++){
        ptr ar =(node *) malloc(sizeof(node));
        ar->flag = true;
        ar->jj = i;
        a->u.next = ar;
        a = a->u.next;
    }
    a->u.next = strt1;
    for(int i=0;i<10000000;i++){
        ptr br =(node *) malloc(sizeof(node));
        br->ii = i;
        br->flag = true;
        b->u.next = br;
        b = b->u.next;
       
    }
    b->u.next = strt2;
    int e;
    int cc;
    cin>>cc;
    for(int i=0;i<cc;i++){
        
       
        cin>>e;
        cin>>m;
        cin>>n;
        if (e==1)
            AddLink(m,n);
        if (e==2)
            DeleteLink(m,n);
        if (e==3)
            cout<<RetrieveValue(m,n)<<endl;
        if (e==4)
            cout<<RetrieveRowSumUptoKthColumn(m,n)<<endl;
        if (e==5)
            cout<<RetrieveColumnSumUptoKthRow(m,n)<<endl;
    }    
}


Что я уже пробовал:

Здесь я получаю ошибку сегментации при выполнении кода.Пожалуйста, решите эту проблему, то есть скажите мне точно, где эта проблема возникает.

1 Ответов

Рейтинг:
0

Jochen Arndt

Поиск строки, которая приводит к ошибке seg, требует отладки вашего приложения.

Однако в вашем коде есть три большие проблемы:


  1. Вы не инициализировали членов выделенных вам структур
  2. Вы не проверяли наличие допустимых указателей (для связанных списков важно инициализировать указатели с нулем и проверять их)
  3. У вас есть профсоюз, где вы можете получить доступ к struct node *next член как int

Особенно последний из них создаст недопустимый указатель в этой строке:
q->u.val-=1;

Мое предложение:

  • Инициализируйте все члены структуры после выделения, установив их равными нулю или используя calloc() вместо malloc()
  • Проверьте все указатели из структуры на наличие NULL перед их использованием
  • Не используйте такого рода союзы