天天看點

單向連結清單二——C語言描述

企業連結清單

企業連結清單.c

#define
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"LinkList1.h"
typedef struct PERSON
{
        LinkNode node;
        char name[64];
        int age;
}Person;
void MyPrint(LinkNode*data)
{
        Person*p = (Person*)data;
        printf("Name:%s Age:%d\n",p->name,p->age);
}
int MyCompare(LinkNode*node1, LinkNode*node2)
{
        Person*p1 = (Person*)node1;
        Person*p2 = (Person*)node2;
        if (strcmp(p1->name, p2->name) == 0 && p1->age == p2->age)
        {
               return 0;
        }
        return -1;
}
void test01()
{
        //建立連結清單
        LinkList*list = Init_LinkList();
        //建立資料
        Person p1, p2, p3, p4, p5;
        strcpy(p1.name, "aaa");
        strcpy(p2.name, "bbb");
        strcpy(p3.name, "ccc");
        strcpy(p4.name, "ddd");
        strcpy(p5.name, "eee");
        p1.age = 10;
        p2.age = 20;
        p3.age = 30;
        p4.age = 40;
        p5.age = 50;
        //将結點插傳入連結表
        Insert_LinkList(list, 0, (LinkNode*)&p1);
        Insert_LinkList(list, 0, (LinkNode*)&p2);
        Insert_LinkList(list, 0, (LinkNode*)&p3);
        Insert_LinkList(list, 0, (LinkNode*)&p4);
        Insert_LinkList(list, 0, (LinkNode*)&p5);
        //列印
        Print_LinkList(list, MyPrint);
        //删除結點
        Remove_LinkList(list, 2);
        //列印
        printf("-----------------------\n");
        Print_LinkList(list, MyPrint);
        //查找
        Person findP;
        strcpy(findP.name, "bbb");
        findP.age = 20;
        int pos=Find_LinkList(list, (LinkNode*)&findP, MyCompare);
        printf("位置:%d\n", pos);
        //釋放連結清單記憶體
        FreeSpace_LinkList(list);
}
int main()
{
        test01();
        return EXIT_SUCCESS;
}      
#include"LinkList1.h"
//初始化連結清單
LinkList*Init_LinkList()
{
        LinkList*list = (LinkList*)malloc(sizeof(LinkList));
        list->head.next = NULL;
        list->size = 0;
        return list;
}
//插入
void Insert_LinkList(LinkList*list, int pos, LinkNode*data)
{
        if (list == NULL)
        {
               return;
        }
        if (data == NULL)
        {
               return;
        }
        if (pos<0 || pos>list->size)
        {
               pos = list->size;
        }
        //查找插入位置
        LinkNode*pCurrent = &(list->head);
        for (int i = 0; i < pos; i++)
        {
               pCurrent = pCurrent->next;
        }
        //插入新結點
        data->next = pCurrent->next;
        pCurrent->next = data;
        list->size++;
}
//删除
void Remove_LinkList(LinkList*list, int pos)
{
        if (list == NULL)
        {
               return;
        }
        if (pos < 0 || pos >=list->size)
        {
               return;
        }
        //輔助指針變量
        LinkNode*pCurrent = &(list->head);
        for (int i = 0; i < pos; i++)
        {
               pCurrent = pCurrent->next;
        }
        //删除結點
        pCurrent->next = pCurrent->next->next;
        list->size--;
}
//查找
int Find_LinkList(LinkList*list, LinkNode*data, COMPARENODE compare)
{
        if (list == NULL)
        {
               return -1;
        }
        if (data == NULL)
        {
               return -1;
        }
        //指派指針變量
        LinkNode*pCurrent = list->head.next;
        int index = 0;
        int flag = -1;
        while (pCurrent!=NULL)
        {
               if (compare(pCurrent, data) == 0)
               {
                       flag=index;
                       break;
               }
               pCurrent = pCurrent->next;
               index++;
        }
        return flag;
}
//傳回連結清單大小
int Size_LinkList(LinkList*list)
{
        return 0;
}
//列印
void Print_LinkList(LinkList*list, PRINTNODE print)
{
        if (list == NULL)
        {
               return;
        }
        //輔助指針
        LinkNode* pCurrent = list->head.next;
        while (pCurrent!=NULL)
        {
               print(pCurrent);
               pCurrent = pCurrent->next;
        }
}
//釋放連結清單記憶體
void FreeSpace_LinkList(LinkList*list)
{
        if (list == NULL)
        {
               return;
        }
        free(list);
}      
#ifndef
#define
#include<stdlib.h>
#include<stdio.h>
//連結清單小結點
typedef struct LINKNODE
{
        struct LINKNODE* next;
}LinkNode;
//連結清單結點
typedef struct LINKLIST
{
        LinkNode head;
        int size;
}LinkList;
//周遊指針
typedef void(*PRINTNODE)(LinkNode*);
//比較函數指針
typedef  int(*COMPARENODE)(LinkNode*, LinkNode*);
//初始化連結清單
LinkList*Init_LinkList();
//插入
void Insert_LinkList(LinkList*list, int pos, LinkNode*data);
//删除
void Remove_LinkList(LinkList* list, int pos);
//查找
int Find_LinkList(LinkList*list, LinkNode*data, COMPARENODE compare);
//傳回連結清單大小
int Size_LinkList(LinkList*list);
//列印
void Print_LinkList(LinkList*list, PRINTNODE print);
//釋放連結清單記憶體
void FreeSpace_LinkList(LinkList*list);
#endif// !LINKLIST_H      

繼續閱讀