線性鏈表的c語言實現

寫於  2015-06-10 13:17:42

#include<stdio.h>
#include<stdlib.h>
typedef int Status;
typedef int Elemtype;
typedef struct LNode{
    Elemtype data;
    struct LNode *next;
}*LinkList;

Status InitList(LinkList &L){
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
    return 1;
}

Status DestoryList(LinkList &L){
    LNode *p,*q;
    p=L;
    while(p->next){
        q=p->next;
        free(p);
        p=q;
    }
    return 1;
}

Status IsListEmpty(LinkList &L){
    if(!L->next) return 1;
    return 0;
}

Status ListLength(LinkList &L){
    LNode *p;
    p=L;
    int i=0;
    while(p->next){
        p=p->next;
        i++;
    }
    return i;
}

Status GetElem(LinkList &L,int i,Elemtype &e){
    LNode *p;
    int j=0;
    p=L;
    while(p->next&&j<i-1){
        p=p->next;
        j++;
    }
    if(!(p->next)||j>i-1) return 0;
    e=p->data;
    return 1;
}

Status LocateElem(LinkList &L,Elemtype e){
    LNode *p;
    p=L;
    int i=0;
    while(p->next){
        i++;
        if(p->data==e)
            return i;
        p=p->next;
    }
    return 0;
}

Status PriorElem(LinkList &L,Elemtype cur_e,Elemtype &pre_e){
    LNode *p,*q;
    p=L;
    int i=0;
    while(p->next){
        q=p;
        i++;
        p=p->next;
        if(p->data==cur_e) {
            q->data=pre_e;
            return 1;
        }
    }
    return 0;
}

Status NextElem(LinkList &L,Elemtype cur_e,Elemtype &next_e){
    LNode *p;
    p=L;
    int i=0;
    while(!p->next){
        i++;
        if(p->data==cur_e){
            p->next->data=next_e;
            return 1;
        }
        p=p->next;
    }
    return 0;
}

Status Listsert(LinkList &L,int i,Elemtype e){
    LNode *p;
    int j=0;
    p=L;
    while(p&&j<i-1){
        p=p->next;
        j++;
    }
    if(!p||j>i-1) return 0;
    LNode *s;
    s=(LinkList)malloc(sizeof(LNode));
    s->data=e; s->next=p->next;
    p->next=s;
    return 1;
}

Status ListDelete(LinkList &L,int i,Elemtype &e){
    LNode *p,*q;
    int j=0;
    p=L;
    while(p->next&&j<i-1){
        p=p->next;
        j++;
    }
    if(!(p->next)||j>i-1) return 0;
    q=p->next; p->next=q->next;
    e=q->data; free(q);
    return 1;
}

Status PrintList(LinkList &L){
    LNode *p;
    p=L;
    while(p->next){
        p=p->next;
        printf("%d\n",p->data);
    }
    return 1;
}



int main(){
    LinkList l;
    InitList(l);
    int set,isclose,locate;
    Elemtype e,cur_e,pre_e,next_e;
    /*student student[10];
     for(int i=0;i<2;i++){
     
     scanf("%s %d",student[i].name,&student[i].score);
     Push(s,student[i]);
     }
     PrintStack(s);
     */
    while(1){
        set=0;
        printf(" 1.插入元素\n 2.刪除指定位置元素並輸出\n 3.輸出鏈表的長度\n 4.銷燬鏈表\n 5.在指定元素前插入一個元素 \n 6.查詢該鏈表是否爲空 \n 7.輸出位置元素\n 8.輸出整個鏈表中的所有元素\n 9.建立鏈表(在銷燬後重建)\n");
        scanf("%d",&set);
        switch(set){
            case 1:printf("請輸入元素及要插入的位置,用空格分隔\n");scanf("%d %d",&e,&locate);if(Listsert(l,locate,e)) printf("插入成功\n");else printf("插入失敗\n"); break;
            case 2:printf("請輸入要刪除的位置\n");scanf("%d",&locate);if(ListDelete(l,locate,e))printf("%d\n",e);else printf("鏈表裏無元素\n");break;
            case 3:printf("%d\n",ListLength(l));break;
            case 4:if(DestoryList(l)) printf("銷燬成功\n");break;
            case 5:printf("請輸入指定的元素和要插入的元素\n");scanf("%d %d",&cur_e,&pre_e); if(PriorElem(l,cur_e,pre_e)) printf("插入成功\n");break;
            case 6:if(IsListEmpty(l)) printf("鏈表爲空\n"); else printf("鏈表不爲空\n");break;
            case 7:printf("請輸入要輸出的位置\n");scanf("%d",&locate);if(GetElem(l,locate,e))printf("%d\n",e);else printf("鏈表裏無元素\n");break;
            case 8:PrintList(l);break;
            case 9:InitList(l);break;
        }
        printf("結束輸入0, 輸入其他任意鍵繼續\n");
        scanf("%d",&isclose);
        if(!isclose) break;
    }
    return 0;
}

2年前寫的。可能出錯
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章