创建链表解析XML文件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a_studycx/article/details/82378820
#include <libxml/parser.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ERR -1

struct inforNode
{
    unsigned char name[20];
    unsigned char number[10];
    unsigned char age[3];
    unsigned char country[20];
    struct inforNode* pNext;
};

typedef struct inforNode InforNode;
typedef InforNode* Link;

void CreateLink(Link* pHead)
{
    *pHead = (Link)malloc(sizeof(InforNode));
    if(*pHead == NULL)
    {
        fprintf(stderr,"Malloc err\n");
    }

    (*pHead)->pNext = NULL;
}

void InsertNode(Link pHead,Link newNode)
{
    Link temp = pHead;
    
    while(temp->pNext != NULL)
    {
        temp = temp->pNext;
    }

    temp->pNext = newNode;
    newNode->pNext = NULL;
}

int DeleteNode(Link pHead,unsigned char* dName)
{
    Link ptr = pHead;
    Link temp = ptr->pNext;

    while(temp != NULL)
    {  
       if(strcmp((const char*)temp->name,(const char*)dName) == 0)
       {
           ptr->pNext = temp->pNext;
           free(temp);
           temp = NULL;
           return 0;
       }
       ptr = temp;
       temp = temp->pNext; 
    }

    return 0;

}

void DisplayNode(Link pHead)
{
    if(pHead == NULL)
    {
        printf("Realsed\n");
    }

    Link temp = pHead->pNext;

    if(pHead->pNext == NULL)
    {
        printf("Empty Link\n");
    }

    while(temp != NULL)
    {
        printf("%s %s %s %s\n",temp->name,temp->number,temp->age,temp->country);
        temp = temp->pNext;
    }
}
 
void FreeList(Link pHead)
{
    Link temp = pHead->pNext;
    
    while(temp->pNext != NULL)
    {
        pHead->pNext = temp->pNext;
        free(temp);
        //tempOne = NULL;
        temp = pHead->pNext;
    }
    free(temp);
    temp = NULL;
    pHead->pNext = NULL;
    free(pHead);
    pHead = NULL;
} 


//链表冒泡排序
void BubbleSortLink(Link pHead)
{
    Link p = NULL;
    Link q = NULL;
    Link tail = NULL;

    while(pHead->pNext != tail)
    {
        p = pHead;
        q = pHead->pNext;

        while(q->pNext != tail)
        {
            if(strcmp((const char*)q->name,(const char*)q->pNext->name) > 0)
            {
                p->pNext = q->pNext;
                q->pNext = q->pNext->pNext;
                p->pNext->pNext = q;
                q = p->pNext;
            }
            q = q->pNext;
            p = p->pNext;
        }
        tail = q;
    }
}

int main()
{
    xmlDocPtr doc;
    xmlNodePtr curNode;
    xmlNodePtr temp;
    xmlChar* name;
    xmlChar* number;
    xmlChar* age;
    xmlChar* country;

    Link pHead = NULL;
    CreateLink(&pHead);

    Link newNode;

    doc =  xmlReadFile("CreateXmlInfo.xml","GB2312",XML_PARSE_RECOVER);
    if(NULL == doc)
    {
        fprintf(stderr,"Document not parsed successfullly.\n");
        exit(ERR);
    }
    
    curNode = xmlDocGetRootElement(doc);
    if(NULL == curNode)
    {
        fprintf(stderr,"Empty document!\n");
        xmlFreeDoc(doc);
        exit(ERR);
    }

    if(xmlStrcmp(curNode->name,BAD_CAST"information"))
    {
        fprintf(stderr,"Document of wrong type,root node =  information!\n");
        xmlFreeDoc(doc);
        exit(ERR);
    }
    
    curNode = curNode->children;
    
    while(curNode != NULL)
    {
        newNode = (Link)malloc(sizeof(InforNode));
        if(xmlHasProp(curNode,BAD_CAST"name"))
        {
            name = xmlGetProp(curNode,BAD_CAST"name");
            memcpy(newNode->name,name,strlen((const char*)name)+1);
            //printf("%s ",name);

            xmlFree(name);
        }

        if(xmlHasProp(curNode,BAD_CAST"number"))
        {
            number = xmlGetProp(curNode,BAD_CAST"number");
            memcpy(newNode->number,number,strlen((const char*)number)+1);
            //printf("%s ",number);

            xmlFree(number);
        }

        if(xmlHasProp(curNode,BAD_CAST"age"))
        {
            age = xmlGetProp(curNode,BAD_CAST"age");
            memcpy(newNode->age,age,strlen((const char*)age)+1);
            //printf("%s ",age);

            xmlFree(age);
        }

        if(xmlHasProp(curNode,BAD_CAST"country"))
        {
            country = xmlGetProp(curNode,BAD_CAST"country");
            memcpy(newNode->country,country,strlen((const char*)country)+1);
            //printf("%s ",country);

            xmlFree(country);
        }
        
        InsertNode(pHead,newNode);

        curNode = curNode->next;
    }
    BubbleSortLink(pHead);
    DisplayNode(pHead);


    printf("Who do you want to delete?\n");

    unsigned char deleteName[20];
    scanf("%s",deleteName);

    DeleteNode(pHead,deleteName);
    
    DisplayNode(pHead);

    FreeList(pHead);
    DisplayNode(pHead);

    xmlFreeDoc(doc);

    return 0;

}

猜你喜欢

转载自blog.csdn.net/a_studycx/article/details/82378820
今日推荐