实现链表创建、插入、查询、反转、销毁功能

实现链表创建、插入、查询、反转、销毁功能

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef struct LinkNode{
        int data;            //数据域
        struct LinkNode *next;      //指针域
}linkNode;


//初始化链表并建立头节点
linkNode* initLinkList()
{
        linkNode* pLinkListHeadNode = (linkNode*)malloc(sizeof(linkNode)); //创建头结点
        if(!pLinkListHeadNode)
        {
                return NULL;
        }
        pLinkListHeadNode->data = 0;    //初始化头结点,这里把头结点的数据域定义为链表结点个数(不包括头结点)
        pLinkListHeadNode->next = NULL;
        return pLinkListHeadNode;
}

//链表插入
int insertElem(linkNode* pLinkListHeadNode, int elem, int index)
{
        if(!pLinkListHeadNode)
        {
                return -1;
        }
        linkNode* pTempLinklist = pLinkListHeadNode;
        int i = 0;
        for(i = 1; i < index; i++)   //先找到插入位置的上一个结点
        {
                if(pTempLinklist == NULL)
                {
                        printf("there is no find insert position!!!");
                        return 0;
                }
                pTempLinklist = pTempLinklist->next;
        }

     //创建插入结点
         linkNode* pInsertLinkListNode = (linkNode*)malloc(sizeof(linkNode));
         if(!pInsertLinkListNode)
         {
                return -1;
         }
         //向链表中插入结点
         pInsertLinkListNode->data = elem;
         pInsertLinkListNode->next = pTempLinklist->next;

         pTempLinklist->next = pInsertLinkListNode;


         //这里给头结点数据域赋值
         pLinkListHeadNode->data++;
}

//删除指定下标的数据结点
int delElem(linkNode* pLinkListHeadNode, int index)
{
        if(!pLinkListHeadNode)
        {
                return -1;
        }
        linkNode* pTempLinklist = pLinkListHeadNode;
        int i = 0;
        for(i = 1; i < index; i++)   //先找到删除位置的上一个结点
        {
                if(pTempLinklist == NULL)
                {
                        printf("there is no find del position!!!");
                        return 0;
                }
                pTempLinklist = pTempLinklist->next;
        }

         linkNode*pDelLinkList = pTempLinklist->next;
         pTempLinklist->next = pDelLinkList->next;
         free(pDelLinkList);
         pLinkListHeadNode->data--;
}

void printLinkListNode(linkNode* pLinkListHeadNode)
{
        if(!pLinkListHeadNode)
        {
                return;
        }
        linkNode*pTempLinkList = pLinkListHeadNode;
        printf("--------------link list node has %d node!!!---------\n", pLinkListHeadNode->data);
        int i = 0;
        while(pTempLinkList->next != NULL)
        {
                printf("node %d data:%d\n", ++i, pTempLinkList->next->data);
                pTempLinkList = pTempLinkList->next;
        }
        printf("--------------link list node info end---------\n");
}

void destoryLinkListNode(linkNode* pLinkListHeadNode)
{
        if(!pLinkListHeadNode)
        {
                return;
        }
        linkNode*pTempLinkList = pLinkListHeadNode;
        while(pTempLinkList->next)
        {
                linkNode *pDelLinkList = pTempLinkList->next;
                pTempLinkList->next = pTempLinkList->next->next;
                free(pDelLinkList);
                pLinkListHeadNode->data--;
        }
       //free(pLinkListHeadNode);
       pLinkListHeadNode = NULL;
}



//头插法
int add_node_head(linkNode* head, linkNode* new_node)
{
        if(NULL == head || NULL == new_node)
                return -1;
        new_node->next = head->next;
        head->next = new_node;
        return 0;
}

//头插法实现反转链表
linkNode* reverseLinklistNode(linkNode* head)
{
    linkNode *p = head->next;
    head->next = NULL;
    linkNode *tmp = NULL;
    while(p)
    {
        tmp = p->next;
        add_node_head(head, p);
        p = tmp;
    }
    return head;
}

//尾插法
int add_node_tail(linkNode* tail, linkNode* new_node)
{
        if(NULL == tail || NULL == new_node)
                return -1;
        new_node->next = tail->next; //新节点指向原来的tail->pNext
        tail->next = new_node;//新节点成为tail->pNext
        return 0;
}

//尾插方式-反转链表
linkNode* revert_list(linkNode* head)
{
        if(NULL == head)
                return;

        linkNode *p = head->next, *end = head;
        while( NULL != end->next )//使得end指向链表最后一个元素
        {
                end = end->next;
        }

        while(p != end)
        {
                head->next = p->next;//分离p
                add_node_tail(end, p);//将p插入到末尾位置
                p = head->next;//p指向第一个元素
        }

        return head;
}

int main()
{
    linkNode* pHeadLinkListNode = initLinkList();

    int i = 0;
    for(i = 0; i < 5; i++)
    {
        insertElem(pHeadLinkListNode, i + 1, i + 1);
    }
    printLinkListNode(pHeadLinkListNode);

    delElem(pHeadLinkListNode, 3);
    printLinkListNode(pHeadLinkListNode);

   // destoryLinkListNode(pHeadLinkListNode);
   // printLinkListNode(pHeadLinkListNode);

    linkNode*pReverseLinkListNode = revert_list(pHeadLinkListNode);
    //   linkNode*pReverseLinkListNode = reverseLinklistNode(pHeadLinkListNode);
    printLinkListNode(pReverseLinkListNode);
    return 0;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值