zoukankan      html  css  js  c++  java
  • 数据结构之线性表--单链表(自带首尾转换)

    数据结构之线性表--单链表(自带首尾转换)

    SingleList.h 简单的头文件其中Status 我在后面没有用,只是用状态描述了一番

    #ifndef SINGLELIST
    #define SINGLELIST
    typedef int ElemType;
    typedef int Status;
    typedef struct LinkList 
    {
        ElemType date;
        struct LinkList *next;
    }LinkNode,*LinkList;//这里只是别名的不同,后来在传参的时候该用指针还得用指针
    #endif
    #include <stdio.h>
    #include <stdlib.h>
    #include "SingleList.h"
    void InitList( LinkList *ppnode)//初始化单链表
    {
        *ppnode = (LinkList)malloc(sizeof(LinkNode));//在这里测试将*取消会产生错误
        if (!(*ppnode))
        {
            return  -1;
        }
        (*ppnode)->next = NULL;
        printf("初始化成功");
        return 0;
    }
    int ListLength(LinkList *pnode)//返回整个单链表的表长
    {
        int i = 0;
        LinkList p =( *pnode)->next;
        while (p)
        {
            ++i;
            p = p->next;
        }
        return i;
    }
    Status ClearList(LinkList *pnode)//若单链表不为空置空;
    {
        LinkList p, q;
        p = (*pnode)->next;
        while (p)
        {
            q = p->next;
            free(p);
            p = q;
        }
        (*pnode)->next = NULL;
        return 1;
    }
    Status ListDisplay(LinkList *pnode)//显示单链表数据
    {
        LinkList p = (*pnode)->next;
        while (p)
        {
    
            printf("-> %d", p->date);
            p = p->next;
        }
        printf("
    ");
        return 1;
    }
    Status GetElem(LinkNode *pnode,int i,ElemType *e)//返回单链表中第i个数据
    {
        int j;
        LinkList p;
        p = pnode->next;
        j = 1;
        while (p&&j < i)
        {
            p = p->next;
            ++j;
        }
        if (!p||j>i)
        {
            return -1;
        }
        *e = p->date;
        return 1;
    
    
    }
    int LocateElem(LinkList pnode, ElemType e)//定位一个数据
    {
        int i = 0;
        LinkList p = pnode->next;
        while (p)
        {
            ++i;
            if (p->date == e)
            {
                return i;
                p = p->next;
            }
            return 0;
    
        }
    }
    void CreatListHead(LinkList *pnode, int n)//头插法插入数值
    {
        LinkList p;
        int i;
        srand(time(0));
        (*pnode) = (LinkList)malloc(sizeof(LinkNode));
        (*pnode)->next = NULL;
        for (int i = 0; i < n;i++)
        {
            p = (LinkList)malloc(sizeof(LinkNode));
            p->date = rand() % 100 + rand() % 50;
            p->next = (*pnode)->next;
            (*pnode)->next = p;
        }
    
    }
    void CreateListTail(LinkList *pnode, int n)//尾插数据
    
    {
    
            LinkList p, r;
            int i;  
            srand(time(0));                         
            pnode= (LinkList)malloc(sizeof(LinkNode)); 
            r = pnode;
            for (i = 0; i < n; i++)     
            {       
                    p = (LinkList)malloc(sizeof(LinkNode));     
                    p->date= rand() % 100 + 1;                  
                    r->next = p;                            
                    r = p;                                      
            }   
            r->next = NULL;                      
    }
    
    
    Status ListInsert(LinkList pnode, int i, ElemType e)//在i处插入数字e;
    {
        int j=1;
        LinkList p, q;
        p = pnode;//节点指向头节点
        while (p&&j<i)
        {
            p = p->next;
            ++j;
        }
        if (!p||j>i)
        {
            return -1;
        }
        q = (LinkList)malloc(sizeof(LinkNode));
        q->date = e;
        q->next = p->next;
        p->next = q;
        return 1;
    }
    Status ListDelete(LinkList pnode, int i, ElemType *e)//删除i处的e
    {
        int j = 1;
        LinkList p, q;
        p = pnode;
        while (p||j<i)
        {
            p = p->next;
            ++j;
        }
        if (!(p->next)||j>i)
        {
            return -1;
        }
        q = p->next;
        p->next = q->next;
        *e = q->date;
        free(q);
        return 1;
    }
    Status ListReverseMethod(LinkList pnode)//逆序反转单链表
    {
        LinkList current, pnext, prev;
        if ((pnode) == NULL || (pnode)->next == NULL)
            return (pnode);
        current = pnode->next;
        pnext = current->next;
        current->next = NULL;
        while (pnext)
        {
            prev = pnext->next;
            pnext->next = current;
            current = pnext;
            pnext = prev;
        }
        (pnode)->next = current;
        return (pnode);
    }
    Status ListReverseMethod2(LinkList pnode)
    {
        LinkList current, p;
        if ((pnode) == NULL)
        {
            return NULL;
        }
        current = (pnode)->next;
        while (current->next!=NULL)
        {
            p = current->next;
            current->next = p->next;
            p->next = (pnode)->next;
            (pnode)->next = p;
            ListReverseMethod(pnode);
            printf("current= %d ,
    ", current->date);
    
        }
        return pnode;
    }
    
    int main(int argc, char **argv)
    {
        LinkList Pnode;
        ElemType e;
        InitList(&Pnode);//错误:原因需要传入指针类型因为函数为InitList(LinkList *ppnode);如果为 (LinkList pnode )就可以在这里采用&pnode
        CreatListHead(&Pnode, 10);
        ListDisplay(&Pnode);
    
        ListReverseMethod(Pnode);
        ListDisplay(&Pnode);
        system("pause");
    }
  • 相关阅读:
    软件测试的术语及解释总结
    测试工具
    数据库客户端连接
    应用程序发生错误怎么修改
    软件测试容易忽略的缺陷
    LR中错误解决方法
    LR结果分析2
    LR结果分析
    Hive
    zookeeper
  • 原文地址:https://www.cnblogs.com/VCctor/p/5100703.html
Copyright © 2011-2022 走看看