• 无表头单链表


    单链表=动态内存分配+结构体+指针

    单链表即单元上非连续的存储结构,有数据域和指针(地址)域。

    好处:增大内存利用率,可以将各个小内存连接起来供大内存程序使用。

    表头唯一代表这一个单链表。

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    typedef int Element;  //修改int 以后定义Element类型也通通修改
    //定义节点结构
    struct node
    {
        Element data;    //数据域
        struct node *next;//指针域
    };
    
    typedef struct node LinkNode;
    //创建单链表--不带头节点
    LinkNode * createLinkList();
    LinkNode * createLinkList()
    {
        LinkNode *head = NULL;  //
        LinkNode *tail = NULL;  //
        LinkNode *temp = NULL;  //临时的节点,指向当前创建的元素
        
        int data;
        scanf("%d",&data);
        
        while (data)
        {
            temp = (LinkNode *)malloc(sizeof(LinkNode));    //temp指向该申请内存,下一次temp指向一个新的内存
            
            if (!temp)          //申请失败
            {
                printf("malloc failed…..");//没内存
            }
            else                         //申请成功
            {
                temp->data = data;       //写入数据到temp数据域中
                temp->next = NULL;       //写入数据到temp指针域中
            }
            
            
            if (head == NULL)           //头为空的时候
            {
                head = temp;            //头指针指向temp
                tail = temp;            //尾指针指向temp
            }
            else                        //头不为空的时候
            {
                tail->next = temp;      //将temp赋给指针域,下一次,next域连上data域
                tail = temp;            //尾指针指向temp
            }
            
            scanf("%d",&data);//接着输入下一个值,输入0就结束
        }
        
        return head;
    }
    
    //输出单链表
    void printLinkList(LinkNode *head);
    void printLinkList(LinkNode *head)
    {
        LinkNode *p = head;
        while (p)        //判断头是否存在
        {
            printf("%d	",p->data);        //输出数据
            p = p->next;            //指向一个指针域,直到空就跳出
        }
    }
    
    //求链表长度
    int length(LinkNode *head);
    int length(LinkNode *head)
    {
        int len = 0;
        LinkNode *p = head;
        
        while (p)
        {
            len++;
            p = p->next;
        }
        
        return len;
    }
    
    int main(int argc, const char * argv[])
    {
        LinkNode *head = NULL;
        head=createLinkList();
        
        printLinkList(head);
        printf("len = %d
    ",length(head));
        
    
           return 0;
    }

     

     1ex

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    typedef int Element;
    
    struct node
    {
        Element data;
        struct node *next;
    };
    
    typedef struct node lNode;
    
    //创建链表
    lNode * createLinkList();
    lNode * createLinkList()
    {
        lNode *head = NULL;
        lNode *tail = NULL;
        lNode *temp = NULL;
        
        int data;
        scanf("%d",&data);
        
        while (data)
        {
            temp = (lNode *)malloc(sizeof(lNode));
            
            if (!temp)
            {
                printf("没内存");
            }
            else
            {
                temp->data = data;
                temp->next = NULL;
            }
            
            if (head == NULL)
            {
                head = temp;
                tail = temp;
            }
            else
            {
                tail->next = temp;
                tail = temp;
            }
            scanf("%d",&data);
        }
        return head;
    }
    //输出单链表
    void printLinkList(lNode *head);
    void printLinkList(lNode *head)
    {
        lNode *p = head;
        while (p) {
            printf("%d	",p->data);
            p = p->next;
        }
    }
    
    //求链表长度
    int len(lNode *head);
    int len(lNode *head)
    {
        int len = 0;
        lNode *p = head;
        while (p)
        {
            len++;
            p = p->next;
        }
        return len;
    }
    //把单链表中第3个结点的值修改为x的值,若修改成功返回1,否则返回0
    bool update(lNode *head);
    bool update(lNode *head)
    {
        bool flag = false;
        int len = 0;
        lNode *p = head;
        while (len < 2)
        {
            len++;
            p = p->next;
        }
        p->data = 15;
        flag = 1;
        return flag;
    }
    //向单链表的表头插入一个元素
    lNode *insertE(lNode *head);        //因为表头改变了所以需要返回表头
    lNode *insertE(lNode *head)
    {
        int data;
        printf("请输入要加入的数
    ");
        scanf("%d",&data);
        lNode *temp = NULL;
        lNode *p = head;
        p = head;
        temp = (lNode *)malloc(sizeof(lNode));
        temp->data = data;
        temp->next = p;
    
        p = temp;
        return p;
        
    }
    
    // 向单链表的末尾添加一个元素
    void insertEtoTail(lNode *head);    //表头没改变,不过返回数据类型为空时最好在该函数内输出。
    void insertEtoTail(lNode *head)
    {
        int data;
        printf("请输入要加入的数
    ");
        scanf("%d",&data);
        lNode *temp = NULL;
        lNode *p = head;
        temp = (lNode *)malloc(sizeof(lNode));
        temp->data = data;
        temp->next = NULL;
        
        int length = len(head);
        p = head;
        for(int i = 0;i < length - 1;i++)
        {
            p = p->next;
        }
        p->next = temp;
        p = temp;
        
    }
    //向单链表中第pos2个结点位置hou插入元素为x的结点,若插入成功返回1,否则返回0
    lNode *insertEtoX(lNode *head);
    lNode *insertEtoX(lNode *head)
    {
        int len = 0;
        lNode *p = head;
        lNode *n = NULL;
        lNode *temp = (lNode *)malloc(sizeof(lNode));
        temp->data = 67;
        temp->next = NULL;
        while (len < 1)
        {
            len++;
            p = p->next;
        }
        n = p->next;
        p->next = temp;
        temp->next = n;
        
        return head;
    }
    //从单链表中删除表头结点,并把该结点的值返回,若删除失败则返回0
    int deleteTop(lNode *head);
    int deleteTop(lNode *head)
    {
        lNode *p = head;
        head = p->next;
        printLinkList(head);
        printf("len = %d
    ",len(head));
        
        return p->data;
    }
    //从单链表中删除表尾结点并返回它的值,若删除失败则返回0
    int deleteTail(lNode *head);
    int deleteTail(lNode *head)
    {
        lNode *p = head;
        int length = len(head);
        p = head;
        for(int i = 0;i < length - 1;i++)
        {
            p = p->next;
        }
        int last = p->data;
        
        p = head;
        for(int i = 0;i < length - 2;i++)
        {
            p = p->next;
        }
        p->next = NULL;
        printLinkList(head);
        printf("len = %d
    ",len(head));
        return last;
    }
    
    int main(int argc, const char * argv[])
    {
        lNode *p = NULL;
        p = createLinkList();
        printLinkList(p);
        printf("len = %d
    ",len(p));
        
        //printf("修改%d
    ",update(p));
        //printLinkList(p);
        
    //    lNode *a =NULL;
    //    a=insertE(p);
    //    printLinkList(a);
    //    printf("len = %d
    ",len(a));
        
    //    insertEtoTail(p);
    //    printLinkList(p);
    //    printf("len = %d
    ",len(p));
        
    //    lNode *x =NULL;
    //    x = insertEtoX(p);
    //    printLinkList(x);
    //    printf("len = %d
    ",len(x));
    
    //    printf("第一个值为%d
    ",deleteTop(p));
        
        printf("最后一个值为%d
    ",deleteTail(p));
        return 0;
    }

    1、返回单链表中第pos个结点中的元素,若pos超出范围,则返回0

    2、把单链表中第pos个结点的值修改为x的值,若修改成功返回1,否则返回0

    3、向单链表的表头插入一个元素 

    4、向单链表的末尾添加一个元素 

    5、向单链表中第pos个结点位置插入元素为x的结点,若插入成功返回1,否则返回0

    6、向有序单链表中插入元素x结点,使得插入后仍然有序 

    7、从单链表中删除表头结点,并把该结点的值返回,若删除失败则返回0

    8、从单链表中删除表尾结点并返回它的值,若删除失败则返回0

  • 相关阅读:
    Liferay 6.2 改造系列之十五:修改默认可用语言
    Liferay 6.2 改造系列之十七:当Portlet无权限时,不显示错误信息
    Liferay 6.2 改造系列之十四:修改组织的表单内容
    Liferay 6.2 改造系列之十三:修改用户编辑页面表单内容
    Liferay 6.2 改造系列之十一:默认关闭CDN动态资源
    matlab向量的排序(自写函数)
    matlab求一个矩阵中各元素出现的个数(归一化)
    matlab求矩阵的鞍点
    matlab求矩阵、向量的模
    matlab求最大公约数和最小公倍数
  • 原文地址:https://www.cnblogs.com/huen/p/3494648.html
Copyright © 2020-2023  润新知