美文网首页程序员
单链表线性表

单链表线性表

作者: 苏鑫的博客 | 来源:发表于2017-09-25 20:17 被阅读0次
    #include<stdio.h>
    #include<stdlib.h>
    
    enum bool {false,true};
    typedef struct LNode{
            char data;
            struct LNode *next;
        }LNode,*LinkList;
        
    void InitList(LinkList *,char []);
    void ClearList(LinkList);
    enum bool ListEmpty(LinkList);
    void ListInsert(LinkList,char,int);
    void delElem(LinkList,char);
    
    void ShowList(LinkList );
    /*void InitList(LinkList *l,char e[]){//头插法
            int i = 0;
            LNode  *p,*q;
            q = (LNode *)malloc(sizeof(LNode));
            for(;i<2;i++){
                    p = (LNode *)malloc(sizeof(LNode));
                    p->data = e[i];
                    p->next = q->next;
                    q->next = p;    
                }
            *l=q;
    }*/
        
    void InitList(LinkList *l,char e[]){
        int i = 0;
        LNode *p,*q;
        q = (LNode *)malloc(sizeof(LNode));
        *l = q;
        q->next = NULL;
        for(;i<2;i++){
            p = (LNode *)malloc(sizeof(LNode));
            p->data = e[i];
            p->next = q->next;
            q->next = p;
            q=p;
        }
    }
    enum bool ListEmpty(LinkList l){
            if(l->next==NULL){
                return true;
            }
            return false;
        }
    
    void ClearList(LinkList l){
        LinkList p,q;
        p = l;
        q = l->next;
        while(q!=NULL){
            p->next = q->next;
            free(q);
            q = p->next;
            }
    }
    void ShowList(LinkList l){  
        if(ListEmpty(l)){
            printf("The Linklist is empty!\n");
        }else{
            LinkList q;     
            q=l->next;
            while(q!=NULL){
                printf("%c\t",q->data);
                q = q->next;
                }
            printf("\n");
        }
        }
        
    void ListInsert(LinkList l,char e,int i){
            LinkList p;
            p=l;
            int j = 0;
            while(p&&j<i){
                p=p->next;
                j++;
                }
            if(!p||j>i){
                printf("error");
                }
            else{
                LinkList s;
                s = (LinkList)malloc(sizeof(LNode));
                s->data = e;
                s->next = p->next;
                p->next = s;
            }
        }
    void delElem(LinkList l,char e){
            LinkList p,q;
            p = l;
            q = l->next;
            while(q){       
                if(q->data==e)break;
                p=q;
                q=q->next;
                }
            p->next = q->next;
            free(q);
                
        }
    int getElem(LinkList l, char e){
        int i = 0;
        LinkList p;
        p=l->next;
        while(p){
            if(p->data==e)break;
            i++;
            p=p->next;
            }
        return i;
        }
    int main(){
            char elements[] = {'a','b'};
            LinkList l=NULL;
            InitList(&l,elements);
            ShowList(l);
            ListInsert(l,'c',2);
            ShowList(l);
            delElem(l,'b');
            ShowList(l);
            int index;
            index = getElem(l,'a');
            printf("%d\n",index);
            ClearList(l);
            ShowList(l);
        }
    
    

    用链表来表示线性表,还有循环链表,双向链表其中算法很多都是相同的,循环链表的特点是最后一个指针指向头指针,双向链表特点是每个结构体都存在两个指针,一个指向前一个结构体,一个纸箱后一个结构体。线性表的子集还包括栈,队列。

    相关文章

      网友评论

        本文标题:单链表线性表

        本文链接:https://www.haomeiwen.com/subject/hxndextx.html