zoukankan      html  css  js  c++  java
  • 单向链表

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define LIST_INIT_SIZE 100
    #define LISTINCREMENT 10
    #define Status int
    #define OVERFLOW -1
    #define OK 1
    #define ERROR 0
    #define ElemType int
    
    typedef struct Node
    {
        ElemType data;
        struct Node *Next;
    }Node, *LinkList;
    
    /*头插法创建链表*/ 
    void CreatListHead(LinkList *L, int n)
    {
        LinkList p = NULL;
        int i;
        
        srand((unsigned)time(0));            //产生随机数种子
        
        *L = (LinkList)malloc(sizeof(Node));       //生成头结点 
        if(NULL == *L)
        {
            printf("ERROR
    ");
            exit(-1);
        }
        else
        {
            (*L)->Next = NULL;         //注意->的优先级高于*,所以必须加括号 
        }
        
        for(i = 0; i < n; ++i)
        {
            p = (LinkList)malloc(sizeof(Node));
            if (NULL == p)
            {
                printf("ERROR
    ");
                exit(-1);
            }
            p->data = rand()%100;        //生成0~100的随机数 
            p->Next = (*L)->Next;         //有头节点 
            (*L)->Next = p;
        }     
    }
    
    /*尾插法创建链表*/
    void CreatListTail(LinkList *L, int n)
    {
        int i;
        LinkList p = NULL, q = NULL;
        
        srand(time(0));
        
        *L = (LinkList)malloc(sizeof(Node));
        if(NULL == *L)
        {
            printf("ERROR
    ");
            exit(-1);
        }
        else
        {
            (*L)->Next = NULL;         //注意->的优先级高于*,所以必须加括号 
        }
        q = *L;
        
        for (i = 0; i < n; ++i)
        {
            p = (LinkList)malloc(sizeof(Node));
            if(NULL == p)
            {
                printf("ERROR
    ");
                exit(-1);
            }
            p->data = rand()%100;
            p->Next = q->Next;
            q->Next = p;
            q = q->Next;        
        }
    }
    
    //删除指定位置的元素 
    Status ListDelete(LinkList *L,  int pos, ElemType *e)
    {
        LinkList q = NULL;
        LinkList p = (*L);
        int j = 0;
        
        //判断条件不可以变为p,当删除位置为最后一个元素的下一个元素的后边的元素的时候,最终p为NULL
        //NULL->Next错误 
        while(p->Next && j < pos-1)     
        {
            p = p->Next;
            j++;
        }
        
        if(!p->Next || j > pos-1)
        {
            exit(-1);
        }
        
        (*e) = p->Next->data;
        q = p->Next;
        p->Next = q->Next;
        free(q);
        
        return OK;
    }
    
    /*遍历链表*/
    void TraverseList(LinkList *L)
    {
        LinkList p = (*L)->Next;
        
        while(NULL != p)
        {
            printf("%d	", p->data);
            p = p->Next;
        }
        printf("
    ");
    } 
    
    /*销毁单链表*/
    void DestroyList(LinkList *L)
    {
        LinkList p = *L, q = p;
        
        while(NULL != p)
        {
            q = p->Next;
            free(p);
            p = q;
        }
        
        return;
    } 
    
    /*清空单链表*/
    void ClearList(LinkList *L)
    {
        LinkList p = (*L)->Next;
        LinkList q = NULL;
        if (NULL == p)
        {
            return;    
        }
        else
        {
            while(NULL != p)
            {
                q = p->Next;
                free(p);
                p = q;
            }
        }
        (*L)->Next = NULL;
    } 
    
    /*头插节点*/
    void InsFirst(LinkList *L, LinkList s)
    {
        s->Next = (*L)->Next;
        (*L)->Next = s;
    }
    
    /*头删节点*/
    void DelFirst(LinkList *L, LinkList *p)
    {
        if (NULL == (*L)->Next)
        {
            return;
        }
        else
        {
            (*p) = (*L)->Next;
            (*L)->Next = (*L)->Next->Next;
        }
    }
    
    /*末尾追加*/
    void AppendList(LinkList *L, LinkList s)
    {
        LinkList p = (*L);
        
        while(NULL != p->Next)
        {
            p = p->Next;
        }
        
        p->Next = s;
    }
    
    /*末尾移除*/
    void RemoveTailNode(LinkList *L, LinkList *P)
    {
        LinkList q = *L;
        
        if(NULL == (*L)->Next)
        {
            return;
        }
        else
        {
            while(NULL != q->Next->Next)
            {
                q = q->Next;
            }
        }
        
        *P = q->Next;
        q->Next = NULL;
    }
    
    /*链表长度*/
    int LengthList(LinkList *L) 
    {
        int len = 0;
        LinkList p = *L;
        
        while (NULL != p->Next)
        {
            len++;
            p = p->Next;
        }
        
        return len;
    }
    
    /*判空*/ 
    int Is_Empty(LinkList *L)
    {
        if(NULL == (*L)->Next)
        {
            return 1;
        }
        else
        {
            return 0;
        }
    }
    
    /*指定位置插入*/
    Status ListInsert(LinkList *L, int pos, ElemType e)
    {
        LinkList s = NULL;
        LinkList p = (*L);
        int j = 0;                  //表示p指向第j个元素 
        
        while(p && j < pos-1)         //p最终指向第pos-1个位置的元素 
        {
            p = p->Next;
            ++j;
        }
        
        if(!p || j > pos-1)
        {
            return ERROR;
        }
        
        s = (LinkList)malloc(sizeof(Node));
        s->data = e;
        s->Next = p->Next;
        p->Next = s;
        
        return OK;
    }
    
    /*设置第i个元素的值*/
    void SetCurElem(LinkList *L, int pos, int e)
    {
        int len = 0;
        LinkList p = *L;
        
        if (pos < 1 || pos > LengthList(L))
        {
            return;
        }
        else
        {
            while(len != pos)
            {
                len++;
                p = p->Next;
            }
    
            p->data = e;
        }
    }
    
    /*按位置查找元素*/
    Status GetCurElem(LinkList *L, int pos, int *e)
    {
        LinkList p = (*L)->Next;
        int j = 1;
        
        while(p && j < pos)
        {
            p = p->Next;
            ++j;
        }
        
        if(!p || j > pos)
        {
            return ERROR;
        }
        
        (*e) = p->data;
        return OK; 
    }
    
    LinkList GetElemValue(LinkList *L, int e)
    {
        LinkList p = (*L)->Next;
        
        while(p && p->data != e)
        {
            p = p->Next;
        }
        return p;
    }
    
    int main(void)
    {
        int e;
        LinkList L;                 //创建一个头指针 
    //    LinkList p;
        CreatListHead(&L, 10);
    //    CreatListTail(&L, 10);
        ListInsert(&L, 2, 9); 
        TraverseList(&L);
        ListDelete(&L, 9, &e); 
    //    GetCurElem(&L, 5, &e);
        printf("位置%d
    ", e);
    //    printf("%d
    ", GetElemValue(&L, 9)->data);    
    //    AppendList(&L, s);               //每插入一个元素,新建一个结点6 
    //    TraverseList(&L);
    //    RemoveTailNode(&L, &p);
    
    //    TraverseList(&L);
    //    SetCurElem(&L, 5, 1000);
    //    GetCurElem(&L, 5, &e);
    //    TraverseList(&L);
    //    printf("%d", e);
    //    DelFirst(&L, &p);
    //    printf("%d
    ", p->data);
    //    InsFirst(&L, s);
    //    ClearList(&L);
        
        return 0;
    }
    
  • 相关阅读:
    AMF序列化技巧
    为什么用ByteArray序列化的对象如此小?
    解决Asp.net中翻页问题的自定义用户控件
    新建对象:反射会调用构造函数,clone不会调用构造函数
    Java 的传值小例子
    JDK中设计模式
    tryfinally中的返回值
    c++类中的常量(注意)
    创建有个性的对话框之MFC篇(转)
    用VC在IE浏览器的工具条上添加命令按钮(转 可以借鉴)
  • 原文地址:https://www.cnblogs.com/zcxhaha/p/11181896.html
Copyright © 2011-2022 走看看