• 无表头单链表增删改查操作


    1、返回单链表中第pos个结点中的元素,若pos超出范围,则返回0
    2、把单链表中第pos个结点的值修改为x的值,若修改成功返回1,否则返回0
    3、向单链表的表头插入一个元素
    4、向单链表的末尾添加一个元素

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

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

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

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    typedef 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;
    }
    //1
    
    int modifyElement(LinkNode *head,int pop,int newElement);
    int modifyElement(LinkNode *head,int pop,int newElement)
    {
        int succss = 0;
        if (pop <= 0 || pop > length(head))
        {
            printf("oops:pos is invalid");
            return succss;
        }
        
        LinkNode *p = head;
        for (int i = 0; i < pop - 1; i++)
        {
            p = p->next;
        }
        
        if (p)
        {
            p ->data = newElement;
            succss = 1;
        }
        return succss;
    }
    
    //2(重点)
    int insertElementToHead(LinkNode **head,Element e);
    int insertElementToHead(LinkNode **head,Element e)
    {
        int success = 0;
        LinkNode *tmp = NULL;
        
        if (e)
        {
            tmp = (LinkNode *)malloc(sizeof(LinkNode));
            tmp->data = e;
            tmp->next = NULL;
        }
        else
        {
            printf("zero is invalid");
            return 0;
        }
        
        //通过指针修改(重点)
        tmp->next = *head;   //连接
        *head = tmp;          //修改地址
        
        return success;
    }
    
    //3
    int insertElementToEnd(LinkNode *head,Element e);
    int insertElementToEnd(LinkNode *head,Element e)
    {
        int success = 0;
        LinkNode *p = head;
        LinkNode *tmp = NULL;
        if(e)
        {
            tmp = (LinkNode *)malloc(sizeof(LinkNode));
            tmp->data = e;
            tmp->next = NULL;
        }
        else
        {
            printf("zero is invalid");
            return 0;
        }
        
        while (p && p->next) {
            p = p->next;
        }
        
        p->next = tmp;
        return success;
    }
    
    int insertElementToPos(LinkNode *head,Element e,int pos);
    int insertElementToPos(LinkNode *head,Element e,int pos)
    {
        int success = 0;
        LinkNode *p = head;
        LinkNode *tmp = NULL;
        if (pos <= 0 && pos >length(head))
        {
            return success;
        }
        
        for (int i = 0; i < pos -2; i++) {
            p = p->next;
        }
        
        tmp = (LinkNode *)malloc(sizeof(LinkNode));
        tmp->data = e;
        tmp->next = NULL;
        
        if (p)
        {
            tmp->next = p->next;
            p->next = tmp;
            success = 1;
        }
        return success;
    }
    
    int insertOrderLinkList(LinkNode *head,Element x);
    int insertOrderLinkList(LinkNode *head,Element x)
    {
        int success = 0;
        
        LinkNode *p = head;
        int loc = 1;
        while (p)
        {
            if(p->data < x)
            {
                p = p->next;
                loc++;
            }
            else
            {
                break;
            }
        }
        
        //此处还要分3种情况头尾中间
        success = insertElementToPos(head,x,loc);
        
        return success;
    }
    
    int deleteHeadNode(LinkNode **head);
    int deleteHeadNode(LinkNode **head)
    {
        int data = 0;
        LinkNode *p = *head;
        data = p->data;
        
        *head = p->next;
        
        return data;
        
    }
    
    int deleteEndNode(LinkNode *head);
    int deleteEndNode(LinkNode *head)
    {
        LinkNode *p = head;
        LinkNode *q = NULL;
        int data = 0;
        for (int i = 0; i < length(head) - 2 ; i++)
        {
            p = p->next;
        }
        
        q = p->next;
        data = q->data;
        p->next = NULL;
        free(q);
        
        return data;
    }
    
    int main(int argc, const char * argv[])
    {
        LinkNode *head = NULL;
        head=createLinkList();
        
        printLinkList(head);
        printf("len = %d
    ",length(head));
        
        /*
        //1
        modifyElement(head,2,54);
        printLinkList(head);
        printf("
    ");
        
        insertElementToHead(&head,90);//
        printLinkList(head);
        printf("
    ");
        
        insertElementToEnd(head,70);
        printLinkList(head);
        printf("
    ");
        
        insertElementToPos(head,100,3);
        printLinkList(head);
        printf("
    ");
    */
        
        insertOrderLinkList(head,23);//此时需表是有序的,输入10到50内数
        printLinkList(head);
        printf("
    ");
        
        deleteHeadNode(&head);
        printLinkList(head);
        printf("
    ");
    
        deleteEndNode(head);
        printLinkList(head);
    
        return 0;
    }
  • 相关阅读:
    一年足迹记录
    Scanf连续调用多次并且存在%c的问题
    Oracle学习计划
    SQL语句、PL/SQL语句、SQL*PLUS语句结束符号
    使用sys无法通过sqlplus或者sqldeveloper连接数据库
    把十进制转化为二进制的一种方法
    GTK+与QT的对比
    数据库崩溃后对redo log的使用
    产生不重复的随机牌
    失效试图,还有就是 还原试图。
  • 原文地址:https://www.cnblogs.com/huen/p/3497532.html
Copyright © 2020-2023  润新知