二重の二重の重の針のチェーンは電子科の主要な部分を実現して法の最後に挿し込みます.

24122 ワード

今日は二重針のチェーンを書きました.つまり、針の針は構造体のアドレスを針で記憶し、二重のポインタでアドレスを格納します.ここのコードには多くのコメントコードが追加されています.
#include
#include

typedef enum Status{
    success,fail,fatal,range_error
} Status;

typedef struct node{    //     
    int elem;
    struct node* next;
} Node, * Ptr;

typedef Ptr* sqlistptr; // int a=10,int *p=&a,int **q=&p
     //   struct node **sqlistptr//*q=p,**q=a

Status List_Init(sqlistptr L){  //   
    Status s = fatal;
    (*L) = (Ptr)malloc(sizeof(Node));
    if(*L){
        (*L)->next = NULL;
        s = success;
    }
    return s;
 }

Status List_HICreate(sqlistptr L,int date[],int len){
    Status s;
    Ptr new;  //     (   )
    int i;
    s = List_Init(L);
    if (s == success){
        for(i=len-1;i>=0;i--){
            new = (Ptr)malloc(sizeof(Node));
            if(new){
                new->elem = date[i];
                new->next = (*L)->next;
                (*L)->next = new;
            }
            else {
                s=fail;  break;
            }
        }
    }
}

Status List_RICreate(sqlistptr L,int date[],int len ){   //   
    Status s;
    Ptr new,curr;
    int i;
    s = List_Init(L);
    curr = *L;
    if (s == success){
        for(i=len-1;i>=0;i--){
            new = (Ptr)malloc(sizeof(Node));
            if(new){
            new->elem = date[i];
            new->next = curr->next;
            curr->next = new;
            curr = new;  //    
            }
            else {
                s=fail;
                break;
            }
        }
    }
}

Status List_Retrieve(sqlistptr L,int pos,int *elem)//     
{
    Status s=range_error;
    Ptr p = (*L)->next;
    int i=1;
    while(i < pos && p){
        i++;
        p=p->next;
    }
    if(i == pos){
        *elem = p->elem;
        s = success;
    }
    return s;
}
Status List_Retrival(sqlistptr L,int pos,sqlistptr elem)//       
{
    Status s = range_error;
    int i=0,j;
    Ptr p = (*L);
    while(p && i<pos){
        i++;
        p = p->next;
    }
    if(p && i==pos){
        *elem = p;
        s = success;
    }
    return s;
}

Status List_Insert(sqlistptr L,int pos,int elem)
{
    Status st;
    Ptr p,s;
    st=List_Retrival(L,pos-1,&p);
    if (st==success){
        s=(Ptr)malloc(sizeof(Node));
        if(s){
            s->elem=elem;
            s->next=p->next;
            p->next=s;
            st=success;
        }
        else st = fatal;
    }
    else st = range_error;
}

Status List_Delate(sqlistptr L,int pos){
    Status k=fail;
    Ptr s,p;
    k= List_Retrival(L,pos-1,&p);
    if(k == success){
        s = p->next;
        p->next = s->next;
        free(s);
        s = NULL;
        k = success;
    }
    return k;
}
void print(sqlistptr L){
     Ptr p=(*L);
     while(p->next!=NULL){
        p = p->next;  //    
        printf("%d",p->elem);
     }
}


int main()
{
    Ptr Q;
    int elem[100],n,i,j,pos;
    printf("        : ");
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%d",&elem[i]);
    }
    List_Init(&Q);
    List_HICreate(&Q,elem,n);//  
    //List_RICreate(&Q,elem,n);//  
    //List_Retrieve(sqlistptr L,int pos,int *elem)//     
    scanf("%d  %d",&pos,&j);
    List_Insert(&Q,pos,j);
    print(&Q);

    return 0;
}