线性表链式存储结构

与传统链表不同的是,业务节点Student首地址与node首地址重叠,底层并不关心业务节点Student如何,只负责把node节点串起来。链表算法与具体业务节点分离!

参考C语言代码(附调试代码):

linear_linklist.c文件(上层应用):

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "linklist.h"
typedef struct
{
    LinkListNode Node;//Student和node首地址重叠
    int age;
    char name[64];
}Student;
//这个是业务节点
void main()
{
    int i = 0;
    Student s1, s2, s3, s4;
    LinkList* list = NULL;
    s1.age = 18;
    s2.age = 19;
    s3.age = 20;
    s4.age = 21;
    list = LinkList_Create();
    if (list == NULL)
    {
        return;
    }
    //链表算法与具体业务节点分离
    LinkList_Insert(list, (LinkListNode *)&s1, 0);
    /*注意,业务节点Student首地址与node首地址重叠,所以可以摆&s1强制转换为LinkListNode型,
    底层并不关心业务节点Student如何,只负责把node节点串起来*/
    LinkList_Insert(list, (LinkListNode *)&s2, 0);
    LinkList_Insert(list, (LinkListNode *)&s3, 0);
    LinkList_Insert(list, (LinkListNode *)&s4, 0);
    //遍历
    for (i = 0; i<LinkList_Length(list); i++)
    {
        Student *tmp = (Student *)LinkList_Get(list, i);
        if (tmp != NULL)
        {
            printf("age:%d ", tmp->age);
        }
    }
    printf("\n");
    LinkList_Delete(list, 2);
    /*while (LinkList_Length(list) > 0)
    {
        Student *tmp = (Student *)LinkList_Delete(list, 0);
        if (tmp != NULL)
        {
            printf("age:%d ", tmp->age);
        }
    }*/
    for (i = 0; i<LinkList_Length(list); i++)
    {
        Student *tmp = (Student *)LinkList_Get(list, i);
        if (tmp != NULL)
        {
            printf("age:%d ", tmp->age);
        }
    }
    LinkList_Destroy(list);
    system("pause");
}

linklist.h文件(头文件):

 1 #ifndef _MYLINKLIST_H_
 2 #define _MYLINKLIST_H_
 3 typedef void LinkList;
 4 typedef struct _tag_LinkListNode
 5 {
 6     struct _tag_LinkListNode* next;
 7 }LinkListNode;
 8 /*这个小节点什么事都不做,没有业务数据,就是用来被(Student)包含的*/
 9 LinkList* LinkList_Create();
10 void LinkList_Destroy(LinkList* list);
11 void LinkList_Clear(LinkList* list);
12 int LinkList_Length(LinkList* list);
13 int LinkList_Insert(LinkList* list, LinkListNode* node, int pos);
14 LinkListNode* LinkList_Get(LinkList* list, int pos);
15 LinkListNode* LinkList_Delete(LinkList* list, int pos);
16 #endif

linklist.c文件(底层库)

  1 #include <stdlib.h>
  2 #include <string.h>
  3 #include <stdio.h>
  4 #include "linklist.h"
  5 /*Create函数返回一个句柄,所以在底层库要有一个结构体*/
  6 typedef struct _tag_LinkList
  7 {
  8     LinkListNode header;
  9     int length;
 10 }S_LinkList;
 11 /*这个负责把节点串起来*/
 12 LinkList* LinkList_Create()
 13 {
 14     S_LinkList* ret = NULL;
 15     ret = (S_LinkList*)malloc(sizeof(S_LinkList));
 16     if (ret == NULL)
 17     {
 18         return NULL;
 19     }
 20     //memset(ret, 0, sizeof(S_LinkList));
 21     ret->length = 0;
 22     ret->header.next = NULL;
 23     return ret;
 24 }
 25 void LinkList_Destroy(LinkList* list)
 26 {
 27     if (list == NULL)
 28     {
 29         return;
 30     }
 31     free(list);
 32     return;
 33 }
 34 void LinkList_Clear(LinkList* list)
 35 {
 36     S_LinkList* ret=NULL;
 37     if (list == NULL)
 38     {
 39         return;
 40     }
 41     ret = (S_LinkList*)list;
 42     ret->length = 0;
 43     ret->header.next = NULL;
 44     return;
 45 }
 46 int LinkList_Length(LinkList* list)
 47 {
 48     S_LinkList* ret = NULL;
 49     if (list == NULL)
 50     {
 51         return 0;
 52     }
 53     ret = (S_LinkList*)list;
 54     return ret->length;
 55 }
 56 int LinkList_Insert(LinkList* list, LinkListNode* node, int pos)
 57 {
 58     LinkListNode* current = NULL;//current辅助指针变量
 59     S_LinkList* s_list;
 60     int ret = 0,i=0;
 61     if (list == NULL || node == NULL || pos < 0)
 62     {
 63         printf("func LinkList_Insert err:%d\n", ret);
 64         return ret;    
 65     }
 66     s_list = (S_LinkList*)list;
 67     current = &(s_list->header);
 68     for (i = 0; i<pos && (current->next != NULL); i++)
 69     {
 70         current = current->next;
 71     }
 72     node->next = current->next;
 73     current->next = node;
 74     s_list->length++;
 75     ret = 1;
 76     return ret;
 77 }
 78 LinkListNode* LinkList_Get(LinkList* list, int pos)
 79 {
 80     LinkListNode* current = NULL;//current辅助指针变量
 81     S_LinkList* s_list;
 82     int ret = 0, i = 0;
 83     if (list == NULL || pos < 0)
 84     {
 85         printf("func LinkList_Insert err:%d\n", ret);
 86         return NULL;
 87     }
 88     s_list = (S_LinkList*)list;
 89     current = &(s_list->header);
 90     for (i = 0; i<pos && (current->next != NULL); i++)
 91     {
 92         current = current->next;
 93     }
 94     return current->next;
 95 }
 96 LinkListNode* LinkList_Delete(LinkList* list, int pos)
 97 {
 98     LinkListNode* current = NULL;//current辅助指针变量
 99     LinkListNode* ret = NULL;//ret辅助指针变量来缓存被删除的节点位置
100     S_LinkList* s_list;
101     int i = 0;
102     if (list == NULL || pos < 0)
103     {
104         printf("func LinkList_Insert err:%d\n", ret);
105         return NULL;
106     }
107     s_list = (S_LinkList*)list;
108     current = &(s_list->header);
109     for (i = 0; i<pos && (current->next != NULL); i++)
110     {
111         current = current->next;
112     }
113     ret = current->next;//ret辅助指针变量来缓存被删除的节点位置
114     current->next = ret->next;    
115     s_list->length--;
116     return ret;
117 }

 

posted @ 2018-03-16 09:23  Alexadar  阅读(127)  评论(0)    收藏  举报