// struct.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "stdio.h"#include "stdlib.h"#include "string.h"#define RETURN_OK 0#define RETURN_ERROR 1#define MAX_LEN 11#define MY_RAND_MAX 26typedef struct tag_Info_S{    int a;    int b;    int c;    char name[MAX_LEN];}Info_S;typedef struct tag_MyList_S{    Info_S stInfo;    struct tag_MyList_S *next;}MyList_S;MyList_S *g_pHead;int AllocOneNode(MyList_S **ppNewNode);void InitOneNode(MyList_S *pNode);int InitList(MyList_S **ppHead);int DelList(MyList_S **ppHead);int AllocOneNode(MyList_S **ppNewNode){    MyList_S *pTemp = (MyList_S *)malloc(sizeof(MyList_S));    if (NULL == pTemp)    {        *ppNewNode = NULL;        return RETURN_ERROR;    }    *ppNewNode = pTemp;    return RETURN_OK;}void InitOneNode(MyList_S *pNode){    int i = 0;    int len = 0;    pNode->stInfo.a = rand() % MY_RAND_MAX; //rand的使用不规范    pNode->stInfo.b = rand() % MY_RAND_MAX;    pNode->stInfo.c = rand() % MY_RAND_MAX;    len = (rand() % (MAX_LEN - 2)) + 1; //1---10    for (i = 0; i < len; i++)    {        pNode->stInfo.name[i] = rand() % MY_RAND_MAX + 'A';    }    pNode->stInfo.name[len] = '\0';    pNode->next = NULL;    return;}int InitList(MyList_S **ppHead){    int ret = RETURN_ERROR;    MyList_S *pNew = NULL;    if (NULL != *ppHead)  //需要先销毁    {        DelList(ppHead);    }    ret = AllocOneNode(&pNew);    if (RETURN_OK != ret)    {        return RETURN_ERROR;    }    memset(pNew, 0, sizeof(MyList_S));    pNew->next = NULL;    *ppHead = pNew;    return RETURN_OK;}int DelList(MyList_S **ppHead){    MyList_S *pFreeNode = NULL;    MyList_S *pTmpNode = NULL;    if (NULL == *ppHead)    {        return RETURN_ERROR;    }    pTmpNode = *ppHead;    while (pTmpNode)    {        pFreeNode = pTmpNode;        pTmpNode = pTmpNode->next;        free(pFreeNode);    }    *ppHead = NULL;    return RETURN_OK;}int GetListLen(MyList_S *pHead, int *ListLen){    int len = 0;    if (NULL == pHead)    {        return RETURN_ERROR;    }    pHead = pHead->next;    while (pHead)    {        len++;        pHead = pHead->next;    }    *ListLen = len;    return RETURN_OK;}int AddNodeAtListTrail(MyList_S **ppHead, MyList_S *pNewNode){    MyList_S *pTemp = NULL;    if (NULL == *ppHead)    {        return RETURN_ERROR;    }    //当前链表为空时,头节点的后面插入    if (NULL == (*ppHead)->next)    {        (*ppHead)->next = pNewNode;        return RETURN_OK;    }    pTemp = (*ppHead)->next;    while (pTemp->next)    {        pTemp = pTemp->next;    }    pTemp->next = pNewNode;    pNewNode->next = NULL;    return RETURN_OK;}int AddNodeAtListHead(MyList_S **ppHead, MyList_S *pNewNode){    if (NULL == *ppHead)    {        return RETURN_ERROR;    }    pNewNode->next = (*ppHead)->next;    (*ppHead)->next = pNewNode;    return RETURN_OK;}//链表从0开始编号,pNewNode插入后在第iLocal位置int AddNodeAtListLocal(MyList_S **ppHead, MyList_S *pNewNode, int iLocal){    int len = 0;    int i = 0;    MyList_S *pTemp = NULL;    if (NULL == *ppHead)    {        return RETURN_ERROR;    }    if (iLocal == 0)    {        AddNodeAtListHead(ppHead, pNewNode);        return RETURN_OK;    }    GetListLen(*ppHead, &len);    if (iLocal > len) //由于从0开始编号,所以iLocal最大为len    {        return RETURN_ERROR;    }    //查找第编号为ilocal - 1的有效节点的位置    pTemp = (*ppHead);    while (i < iLocal)    {        pTemp = pTemp->next;        i++;    }    pNewNode->next = pTemp->next;    pTemp->next = pNewNode;    return RETURN_OK;}int DelOneNodeAtListTrail(MyList_S **ppHead, MyList_S *pDelNode){    MyList_S *pPre = NULL;    MyList_S *pCur = NULL;    if (NULL == *ppHead || NULL == (*ppHead)->next)    {        return RETURN_ERROR;    }    pCur = (*ppHead)->next;    if (NULL == pCur->next) //如果只有一个节点,可以使用DelOneNodeAtListHead删除    {        memcpy_s(&(pDelNode->stInfo), sizeof(Info_S), &(pCur->stInfo), sizeof(Info_S));        (*ppHead)->next = NULL;        free(pCur);        pCur = NULL;    }    while (pCur->next) //pCur->next = NULL,pCur为最后一个有效节点    {        pPre = pCur;        pCur = pCur->next;    }    pPre->next = NULL;    memcpy_s(&(pDelNode->stInfo), sizeof(Info_S), &(pCur->stInfo), sizeof(Info_S));    free(pCur);    pCur = NULL;    return RETURN_OK;}int DelOneNodeAtListHead(MyList_S **ppHead, MyList_S *pDelNode){    MyList_S *pCur = NULL;    if (NULL == *ppHead || NULL == (*ppHead)->next)    {        return RETURN_ERROR;    }    pCur = (*ppHead)->next;    (*ppHead)->next = pCur->next;    memcpy_s(&(pDelNode->stInfo), sizeof(Info_S), &(pCur->stInfo), sizeof(Info_S));    free(pCur);    return RETURN_OK;}int DelNodeAtListLocal(MyList_S **ppHead, MyList_S *pDelNode, int iLocal){    int i = 0;    int len = 0;    MyList_S *pTemp = NULL;    MyList_S *pFreeNode = NULL;    if (NULL == *ppHead || NULL == (*ppHead)->next)    {        return RETURN_ERROR;    }    if (iLocal == 0)    {        DelOneNodeAtListHead(ppHead, pDelNode);        return RETURN_OK;    }    (void)GetListLen(*ppHead, &len); //不用判断返回值了,此处是内部调用,前面的判断可以保证此处可以获取到长度    if (iLocal >= len)    {        return RETURN_ERROR;  //最大到len - 1    }    pTemp = *ppHead;    while (i < iLocal)    {        pTemp = pTemp->next;        i++;    }    pFreeNode = pTemp->next;    memcpy_s(&(pDelNode->stInfo), sizeof(Info_S), &(pFreeNode->stInfo), sizeof(Info_S));    pTemp->next = pFreeNode->next;    free(pFreeNode);    pFreeNode = NULL;    return RETURN_OK;}int RevertList(MyList_S *pHead) //头指针的指向不发生变化,变化的是pHead->next{    MyList_S *pPre = NULL;    MyList_S *pCur = NULL;    if (NULL == pHead || NULL == pHead->next)    {        return RETURN_ERROR;    }    pPre = pHead->next;    pHead->next = NULL;    while (pPre)    {        pCur = pPre->next;        pPre->next = NULL;        AddNodeAtListHead(&pHead, pPre);        pPre = pCur;    }    return RETURN_OK;}/*排序,先按a排序,a相同按照b排序,b相同按照c排序,c相同按照name排序*/int SrcCopyInfoToDst(void *dst, void *src){    if (NULL == dst || NULL == src)    {        return RETURN_ERROR;    }    memcpy_s(dst, sizeof(Info_S), src, sizeof(Info_S));    return RETURN_OK;}int sort(MyList_S *pHead){    MyList_S *pCur = NULL;    MyList_S *pNext = NULL;    Info_S stInfo = { 0 };    if (NULL == pHead || NULL == pHead->next)    {        return RETURN_ERROR;    }    pCur = pHead->next;    if (NULL == pCur)    {        return RETURN_OK;    }    //排序,比较搓考虑优化    while (pCur)    {        pNext = pCur;        while (pNext)        {            if (pNext->stInfo.a > pCur->stInfo.a)            {                SrcCopyInfoToDst(&stInfo, &(pCur->stInfo));                SrcCopyInfoToDst(&(pCur->stInfo), &(pNext->stInfo));                SrcCopyInfoToDst(&(pNext->stInfo), &stInfo);            }            else if (pNext->stInfo.a == pCur->stInfo.a)            {                if (pNext->stInfo.b > pCur->stInfo.b)                {                    SrcCopyInfoToDst(&stInfo, &(pCur->stInfo));                    SrcCopyInfoToDst(&(pCur->stInfo), &(pNext->stInfo));                    SrcCopyInfoToDst(&(pNext->stInfo), &stInfo);                }                else if (pNext->stInfo.b == pCur->stInfo.b)                {                    if (pNext->stInfo.c > pCur->stInfo.c)                    {                        SrcCopyInfoToDst(&stInfo, &(pCur->stInfo));                        SrcCopyInfoToDst(&(pCur->stInfo), &(pNext->stInfo));                        SrcCopyInfoToDst(&(pNext->stInfo), &stInfo);                    }                    else if (pNext->stInfo.c == pCur->stInfo.c)                    {                        if (strcmp(pCur->stInfo.name, pNext->stInfo.name) > 0)                        {                            SrcCopyInfoToDst(&stInfo, &(pCur->stInfo));                            SrcCopyInfoToDst(&(pCur->stInfo), &(pNext->stInfo));                            SrcCopyInfoToDst(&(pNext->stInfo), &stInfo);                        }                    }                }            }            pNext = pNext->next;        }        pCur = pCur->next;    }    return RETURN_OK;}void printList(MyList_S *pHead){    if (NULL == pHead)    {        return;    }    pHead = pHead->next;    while (pHead)    {        printf("a = %d, b = %d, c = %d, name = %s\n", pHead->stInfo.a, pHead->stInfo.b, pHead->stInfo.c, pHead->stInfo.name);        pHead = pHead->next;    }    printf("-----------------------------------------------------------------------------------\n");    return;}int _tmain(int argc, _TCHAR* argv[]){    int i = 0;    int len = 0;    int ret = RETURN_ERROR;    MyList_S *pTemp = NULL;    InitList(&g_pHead);    for (i = 0; i < 10; i++)    {        ret = AllocOneNode(&pTemp);        if (RETURN_OK != ret)        {            printf("alloc node failed!\n");            return RETURN_ERROR;        }        InitOneNode(pTemp);        if (i % 2)        {            AddNodeAtListTrail(&g_pHead, pTemp);        }        else        {            AddNodeAtListHead(&g_pHead, pTemp);        }    }    GetListLen(g_pHead, &len);    printf("len = %d\n", len);    printList(g_pHead);    ret = AllocOneNode(&pTemp);    if (RETURN_OK != ret)    {        printf("alloc node failed!\n");        return RETURN_ERROR;    }    InitOneNode(pTemp);    AddNodeAtListLocal(&g_pHead, pTemp, 10);    GetListLen(g_pHead, &len);    printf("len = %d\n", len);    printList(g_pHead);    DelNodeAtListLocal(&g_pHead, pTemp, 10);    GetListLen(g_pHead, &len);    printf("len = %d\n", len);    printList(g_pHead);    RevertList(g_pHead);    printList(g_pHead);    sort(g_pHead);    printList(g_pHead);    return 0;}