/*
题目59:链表如下
typedef struct _LinkList
{
int data;
struct _LinkList*next;
} LinkList;
有如下结点数据域  1 2 3 4 5 6 7 8 12 19 。。。。
要求1:创建链表
要求2:删除结点值为偶数的结点 ;70分
要求3:编写测试用例  30分
*/


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

typedef struct _linklist{
    int data;
    struct _linklist *pnext;
}LinkList;

//初始化链表头结点
int InitLink(LinkList **pout/*out*/){
    int ERRO_MSG = 0;
    if (pout==NULL)
    {
        ERRO_MSG = 1;
        printf("pout==NULL erro msg:%d\n", ERRO_MSG);
        return ERRO_MSG;
    }
    LinkList * phead = (LinkList *)malloc(sizeof(LinkList));
    if (phead==NULL)
    {
        ERRO_MSG = 2;
        printf("分配内存失败 erro msg:%d\n", ERRO_MSG);
        return ERRO_MSG;
    }
    phead->data = 0;
    phead->pnext = NULL;
    *pout = phead;
    return ERRO_MSG;
}

//创建链表节点
int CreateLink(LinkList *pin/*in*/,int data){
    int ERRO_MSG = 0;
    if (pin==NULL)
    {
        ERRO_MSG = 1;
        printf("pin==NULL erro msg:%d\n", ERRO_MSG);
        return ERRO_MSG;
    }
    LinkList *pHead = pin;
    LinkList *pCurrent = pHead->pnext;
    //创建新节点
    LinkList *pMalloc = (LinkList *)malloc(sizeof(LinkList));
    pMalloc->data = data;
    pMalloc->pnext = NULL;
    if (pCurrent==NULL)
    {
        pHead->pnext = pMalloc;
        return ERRO_MSG;
    }
    //遍历到链表节点末尾位置
    while (pCurrent->pnext){
        pCurrent = pCurrent->pnext;
    }
    pCurrent->pnext = pMalloc;
    return ERRO_MSG;
}

//删除结点值为偶数的结点
int DelLink(LinkList *pin/*in*/){
    int ERRO_MSG = 0;
    if (pin == NULL)
    {
        ERRO_MSG = 1;
        printf("pin==NULL erro msg:%d\n", ERRO_MSG);
        return ERRO_MSG;
    }
    LinkList *pHead = pin;
    LinkList *pCurrent = pHead->pnext;
    LinkList * pPrior = pHead;
    while (pCurrent){
        if (pCurrent->data%2==0)
        {
            pPrior->pnext = pCurrent->pnext;
            //释放这个节点
            free(pCurrent);
            pCurrent = NULL;
            pCurrent = pPrior->pnext;
        }
        else{
            pPrior = pCurrent;
            pCurrent = pCurrent->pnext;
        }
    }
    return ERRO_MSG;
}

//打印链表
void PrintfA(LinkList *pin/*in*/){
    if (pin==NULL)
    {
        printf("链表不可以为空!\n");
    }
    LinkList *pHead = pin;
    LinkList *pCurrent = pHead->pnext;
    while (pCurrent){
        printf("%d\n", pCurrent->data);
        pCurrent = pCurrent->pnext;
    }
}

//释放链表
int FreeLink(LinkList **pin/*in*/){
    int ERRO_MSG = 0;
    if (pin==NULL)
    {
        ERRO_MSG = 1;
        printf("pin==NULL erro msg:%d\n", ERRO_MSG);
        return ERRO_MSG;
    }
    LinkList *pHead = *pin;
    LinkList *pCurrent = pHead->pnext;
    LinkList *pPrior = pHead;
    while (pCurrent){
        pPrior->pnext = pCurrent->pnext;
        //释放内存
        if (pCurrent)
        {
            free(pCurrent);
            pCurrent = NULL;
        }
        pCurrent = pPrior->pnext;
    }
    if (pHead)
    {
        free(pHead);
        pHead = NULL;
    }
    return ERRO_MSG;
}

void main(){
    int i = 0,ret=0;
    //初始化链表头结点
    LinkList *pHead = NULL;
    //初始化头结点
    InitLink(&pHead);
    //创建节点
    for (i = 0; i < 9; i++)
    {
        ret=CreateLink(pHead, i + 1);
        if (ret!=0)
        {
            printf("创建链表节点报错!\n");
            //释放所有链表节点
            goto END;
        }
    }
    //打印所有节点
    PrintfA(pHead);
    //删除部分节点
    ret=DelLink(pHead);
    if (ret!=0)
    {
        printf("删除偶数节点报错!\n");
        //释放所有链表节点
        goto END;
    }
    //打印所有节点
    PrintfA(pHead);
END:
    //释放所有节点
    FreeLink(&pHead);
    system("pause");
}

 

C语言 百炼成钢23_结点