单链表增删改查,排序(结点交换)->敲黑板划重点

敲黑板划重点

头文件 myll.h

	/*************************************************************************
	> File Name: myll.h
	> Author:lanyxs 
	> Mail:lanyxs@126.com 
	> Created Time: Thu 08 Aug 2019 12:27:53 AM PDT
 ************************************************************************/

#ifndef _MYLL_H
#define _MYLL_H

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

    
    typedef int DATA_T;

    typedef struct node
    {
        DATA_T data;
        struct node *pNext;
    }NODE;
    typedef struct list
    {
        NODE *phead;
        NODE *ptial;
        int len;
    }LLT;

    int create_list(LLT **pplist);
    int destory_list(LLT **pplist);
    int insert_elem(LLT *plist,int index,DATA_T newData);
    int print_list(LLT *plist);
    int delete_elem(LLT *plist,int index); 
    int replace_elem(LLT *plist,int index,DATA_T rdata);
#endif

函数文件:my_link-list.c

/*************************************************************************
> File Name: my_link_list.c
> Author:lanyxs 
> Mail:lanyxs@126.com 
> Created Time: Thu 08 Aug 2019 12:33:49 AM PDT
************************************************************************/

#include "../include/myll.h"

/*创建链表*/
int create_list(LLT **pplist)
{
    if(pplist == NULL)
    {
        puts("NULL pointer error.");
        return -1;
    }
    *pplist = (LLT *)malloc(sizeof(LLT));
    if((*pplist) == NULL)
    {
        puts("malloc faild");
        return -1;
    }
    memset(*pplist,0,sizeof(LLT));
    (*pplist)->phead = NULL;
    (*pplist)->ptial = NULL;
    (*pplist)->len = 0;
    return 0;
}

/*销毁链表*/

int destory_list(LLT **pplist)
{
    if(pplist == NULL || (*pplist) == NULL)
    {
        puts("NULL pointer error.");
        return -1;
    }
    if((*pplist)->phead != NULL)
    {
        NODE *p = (*pplist)->phead;
        while(p)
        {
            NODE *pTemp = p;
            p = p->pNext;
            free(pTemp);
        }
    }
    free(*pplist);
    *pplist = NULL;
    return 0;
}

/*插入*/
int insert_elem(LLT *plist,int index,DATA_T newData)
{
    if(plist == NULL)
    {
        puts("NULL pointer error.");
        return -1;
    }
    if(index < 0 || index > plist->len)
    {
        puts("index out range.");
        return -1;
    }
    NODE *p = (NODE *)malloc(sizeof(NODE));
    if(p == NULL)
    {
        puts("malloc node fault.");
        return -1;
    }
    p->data = newData;
    if(index == 0 && plist->len == 0)   //头部插入(第一次)
    {
        p->pNext = NULL;
        plist->phead = p;
        plist->ptial = p;
    }
    else if(index == 0 && plist->len != 0) //头部插入(不是首次插入)
    {
        p->pNext = plist->phead;
        plist->phead = p;
    }
    else if(index > 0 && index < plist->len) //中间插入
    {
        int i;
        NODE *ptmp = plist->phead;
        for(i = 0;i < index-1;i++)
        {
            ptmp = ptmp->pNext;
        }
        p->pNext = ptmp->pNext;
        ptmp->pNext = p;
    }
    else if(index == plist->len)    //尾部插入
    {
        plist->ptial->pNext = p;
        plist->ptial = p;
        p->pNext = NULL;
    }
    plist->len += 1;
    return 0;
}

/*遍历*/
int print_list(LLT *plist)
{
    if(plist == NULL || plist->phead == NULL)
    {
        puts("NULL pointer error.");
        return -1;
    }
    NODE *ptmp = plist->phead;
    while(ptmp)
    {
        printf("%d ",ptmp->data);
        ptmp = ptmp->pNext; 
    }
    puts("");
    return 0;
}

/*删除*/
int delete_elem(LLT *plist,int index)
{
    if(plist == NULL || plist->phead == NULL)
    {
        puts("NULL pointer error.");
        return -1;
    }
    if(index > plist->len || index < 0)
    {
        puts("index out range.");
        return -1;
    }
    NODE *p = plist->phead;
    if(index == 0)
    {
        plist->phead = p->pNext;
        if(plist->len == 1)
        {
            plist->ptial = NULL;
        }
        free(p);
    }
    else if(index > 0)
    {
        int i;
        for(i = 0;i < index-1;i++)
        {
            p = p->pNext;
        }
        if(index == plist->len-1)
        {
            plist->ptial = p;
            free(p->pNext);
            p->pNext = NULL;
        }
        if(index != plist->len-1)
        {
            NODE *pdel = p->pNext;
            p->pNext = pdel->pNext;
            free(pdel);
        }
    }
    plist->len -= 1;
    return 0;
}


/*replace*/
int replace_elem(LLT *plist,int index,DATA_T rdata)
{
    if(plist == NULL || plist->phead == NULL)
    {
        puts("NULL pointer error.");
        return -1;
    }
    if(index < 0 || index > plist->len)
    {
        puts("index out range.");
        return -1;
    }
    int i;
    NODE *p = plist->phead;
    for(i = 0;i < index;i++)
    {
        p = p->pNext;
    }
    p->data = rdata;
    return 0;
}
/*排序*/
int sort_list(LLT *plist)
{
    if(plist == NULL || plist->phead == NULL)
    {
        puts("NULL pointer error.");
        return -1;
    }
    NODE *p1 = plist->phead;   
    NODE *p2 = plist->phead;
    while(p1)
    {
        p2 = p1->pNext;
        while(p2)
        {
            if(p1->data > p2->data)
            {
                /*用交换结点函数进行交换*/
                swap_node(plist,p1,p2);
            }
            p2 = p2->pNext;
        }
        p1 = p1->pNext;
    }
    return 0;
}

/*删除多余元素*/
int del_res_elem(LLT *plist)
{
    if(plist == NULL)
    {
        puts("NULL pointer error.");
        return -1;
    }
    NODE *p1 = plist->phead;
    while(p1)
    {
        NODE *p2 = p1;
        while(p2->pNext)
        {
            if(p1->data == p2->pNext->data)
            {
                NODE *ptmp = p2->pNext;
                if(ptmp->pNext == NULL)
                {
                    free(ptmp);
                    p2->pNext = NULL;
                    break;
                }
                else{
                    p2->pNext = ptmp->pNext;
                    free(ptmp);
                }
                plist->len -= 1;
            }
            p2 = p2->pNext;
        }
        p1 = p1->pNext;
    }
    return 0;
}


/*找结点的前驱*/
NODE *find_prenode(LLT *plist,NODE *pnode)
{
    if(plist == NULL || pnode == NULL)
    {
        puts("NULL pointer error.");
        return NULL;
    }
    if(pnode == plist->phead)  //头指针没有前驱,返回本身
    {
        return pnode;
    }
    else{
        NODE *preNode = plist->phead;
        while(preNode)
        {
            if(preNode->pNext == pnode)
            {
                return preNode;
            }
            preNode = preNode->pNext;
        }
    }
    return NULL;
}

/*交换结点*/
int swap_node(LLT *plist,NODE *pnode1,NODE *pnode2)
{
    if(plist == NULL || pnode1 == NULL || pnode2 == NULL)
    {
        puts("NULL pointer error.");
        return -1;
    }
    NODE *pPre1 = find_prenode(plist,pnode1);
    NODE *pPre2 = find_prenode(plist,pnode2);
    if(pPre1 == NULL || pPre2 ==NULL) return -1;

    /*相邻的情况(pnode1在前,pnode2在后)*/
    if(pnode1 == pPre2)
    {
        if(pnode1 == plist->phead)
        {
            plist->phead = pnode2;  /*头部两个相邻*/
        }else{
            pPre1->pNext = pnode2;
        }
        if(pnode2->pNext == NULL)  /*尾部两个相邻*/
        {
            pnode1->pNext = NULL;
            plist->ptial = pnode1;
        }else{
            pnode1->pNext = pnode2->pNext;
        }
        pnode2->pNext = pnode1;
        return 0;
    }
    /*相邻的情况(pnode2在前,pnode1在后)*/
    if(pnode2 == pPre1)
    {
        if(pnode2 == plist->phead)
        {
            plist->phead = pnode1;
        }else{
            pPre2->pNext = pnode1;
        }
        if(pnode1->pNext == NULL)
        {
            pnode2->pNext = NULL;
            plist->ptial = pnode2;
        }else{
            pnode2->pNext = pnode1->pNext;    
        }
        pnode1->pNext = pnode2;
        return 0;
    }
    /*不相邻的情况*/
    else{
        if(plist->phead == pnode1 && pnode2->pNext != NULL)
        {
            NODE *p = pnode1->pNext;
            plist->phead = pnode2;
            pnode1->pNext = pnode2->pNext;
            pPre2->pNext = pnode1;
            pnode2->pNext = p;
        }
        if(plist->phead == pnode2 && pnode1->pNext != NULL)
        {
            NODE *p = pnode2->pNext;
            plist->phead = pnode1;
            pnode2->pNext = pnode1->pNext;
            pPre1 ->pNext = pnode2;
            pnode1->pNext = p;
        }
        if(plist->phead == pnode1 && pnode2->pNext == NULL)
        {
            plist->phead = pnode2;
            pnode2->pNext = pnode1->pNext;
            pPre2->pNext = pnode1;
            pnode1->pNext = NULL;
            plist->ptial = pnode1;
        }
        
       if(plist->phead == pnode2 && pnode1->pNext == NULL)
        {
            plist->phead = pnode1;
            pnode1->pNext = pnode2->pNext;
            pPre1->pNext = pnode2;
            pnode2->pNext = NULL;
            plist->ptial = pnode2;
        }
        else{
            NODE *p = pnode1->pNext;
            pnode1->pNext = pnode2->pNext;
            pPre1->pNext = pnode2;
            pPre2->pNext = pnode1;
            pnode2->pNext = p;
        }
        return 0;
    }
return 0;
}

main.c

/*************************************************************************
	> File Name: main.c
	> Author:lanyxs 
	> Mail:lanyxs@126.com 
	> Created Time: Thu 08 Aug 2019 12:54:19 AM PDT
 ************************************************************************/

#include "../include/myll.h"
int main()
{
    int op,index;
    DATA_T data;
    LLT *plist = NULL;
    create_list(&plist);
    
    printf("1.---------------[ insert ]---------\n");
    printf("2.---------------[ output ]---------\n");
    printf("3.---------------[ delete ]---------\n");
    printf("4.---------------[ replace ]--------\n");
    printf("5.---------------[ DelResElem ]--------\n");
    printf("6.---------------[ sortList ]--------\n");
    printf("0.---------------[ exit    ]--------\n");
    while(1)
    {
        printf("please input option:");
        scanf("%d",&op);
        switch(op)
        {
            case 1:
                puts("please input data and index:");
                scanf("%d%d",&data,&index);
                insert_elem(plist,index,data);
                break;
            case 2:
                print_list(plist);
                break;
            case 3:
                puts("please input delete index");
                scanf("%d",&index);
                delete_elem(plist,index);
                break;
            case 4:   
                puts("please input replace  data and index:");
                scanf("%d%d",&data,&index);
                replace_elem(plist,index,data);
                break;
            case 5:
                del_res_elem(plist);
                break;
            case 6:
                puts("-------排序后----------");
                sort_list(plist);
                print_list(plist);
                break;
            case 0:
                return -1;
        }
    }



    destory_list(&plist);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值