数据结构学习笔记
线性表
概念
全名为线性存储结构。使用线性表存储数据的方式可以这样理解,即“把所有数据用一根线儿串起来,再存储到物理空间中”
分类
将数据依次存储在连续的整块物理空间中,这种存储结构称为顺序存储结构(简称顺序表)
数据分散的存储在物理空间中,通过一根线保存着它们之间的逻辑关系,这种存储结构称为链式存储结构(简称链表)
顺序表
概念
顺序表对数据的物理存储结构也有要求。顺序表存储数据时,会提前申请一整块足够大小的物理空间,然后将数据依次存储起来,存储时做到数据元素之间不留一丝缝隙。如图
Tips:顺序表在申请时需要为顺序表记录两个数据。
1:顺序表申请的存储容量
2:顺序表的长度,也就是表中存储数据元素的个数
3:顺序表申请的存储容量要大于顺序表的长度
声明顺序表
typedef struct Table{
int* head;//声明了一个名为head的长度不确定的数组,也叫“动态数组”
int length;//记录当前顺序表的长度
int size; //记录顺序表分配的存储容量
}table;
Tips:
head 是我们声明的一个未初始化的动态数组,不要只把它看做是普通的指针
初始化顺序表
给链表头 head 动态数据申请足够大小的物理空间;
给 size 和 length 赋初值;
table initTable(){
table t;
//构造一个空的顺序表,动态申请存储空间
t.head=(int*)malloc(Size*sizeof(int));
if (!t.head) //如果申请失败,作出提示并直接退出程序
{
printf("初始化失败");
exit(0);
}
t.length=0;//空表的长度初始化为0
t.size=Size;//空表的初始存储空间为Size
return t;
}
顺序表元素赋值
for (int i=1; i<=Size; i++)
{
t.head[i-1]=i;
t.length++;
}
顺序表显示数据
//输出顺序表中元素的函数
void displayTable(table t)
{
for (int i=0;i<t.length;i++)
{
printf("%d ",t.head[i]);
}
printf("\n");
}
顺序表插入元素
插入函数,其中,elem为插入的元素,add为插入到顺序表的位置
table addTable(table t,int elem,int add)
{
//判断插入本身是否存在问题(如果插入元素位置比整张表的长度+1还大(如果相等,是尾随的情况),或者插入的位置本身不存在,程序作为提示并自动退出)
if (add>t.length+1||add<1)
{
printf("插入位置有问题");
return t;
}
//做插入操作时,首先需要看顺序表是否有多余的存储空间提供给插入的元素,如果没有,需要申请
if (t.length==t.size)
{
t.head=(int *)realloc(t.head, (t.size+1)*sizeof(int));
if (!t.head)
{
printf("存储分配失败");
return t;
}
t.size+=1;
}
//插入操作,需要将从插入位置开始的后续元素,从最后面一个元素逐个后移。
for (int i=t.length-1; i>=add-1; i--)
{
t.head[i+1]=t.head[i];
}
//后移完成后,直接将所需插入元素,添加到顺序表的相应位置
t.head[add-1]=elem;
//由于添加了元素,所以长度+1
t.length++;
return t;
}
顺序表删除元素
table delTable(table t,int add)
{
if (add>t.length || add<1)
{
printf("被删除元素的位置有误");
exit(0);
}
//删除操作
for (int i=add; i<t.length; i++)
{
//找到需要删除的元素,使其后面的元素前移一位
t.head[i-1]=t.head[i];
}
t.length--;
return t;
}
顺序表查找元素
//查找函数,其中,elem表示要查找的数据元素的值
int selectTable(table t,int elem)
{
for (int i=0; i<t.length; i++)
{
if (t.head[i]==elem)
{
return i+1;
}
}
//如果查找失败,返回-1
return -1;
}
顺序表修改元素
//更改函数,其中,elem为要更改的元素,newElem为新的数据元素
table amendTable(table t,int elem,int newElem)
{
//先查找到该元素位置下标
int add=selectTable(t, elem);
//由于返回的是元素在顺序表中的位置,所以-1就是该元素在数组中的下标
t.head[add-1]=newElem;
return t;
}
链表
概念
链表,别名链式存储结构或单链表,用于存储逻辑关系为 “一对一” 的数据。与顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其物理存储位置是随机的。
Tips:链表中每个数据的存储都由以下两部分组成:
数据元素本身,其所在的区域称为数据域;
指向直接后继元素的指针,所在的区域称为指针域
一个完整的链表需要由以下几部分构成:
头指针:一个普通的指针,它的特点是永远指向链表第一个节点的位置。很明显,头指针用于指明链表的位置,便于后期找到链表并使用表中的数据;
节点:链表中的节点又细分为头节点、首元节点和其他节点:
头节点:其实就是一个不存任何数据的空节点,通常作为链表的第一个节点。对于链表来说,头节点不是必须的,它的作用只是为了方便解决某些实际问题;
首元节点:由于头节点(也就是空节点)的缘故,链表中称第一个存有数据的节点为首元节点。首元节点只是对链表中第一个存有数据节点的一个称谓,没有实际意义;
其他节点:链表中其他的节点
注意:链表中有头节点时,头指针指向头节点;反之,若链表中没有头节点,则头指针指向首元节点。
声明链表
typedef struct Link
{
char elem; //代表数据域
struct Link * next; //代表指针域,指向直接后继元素
}link;
//link为节点名,每个节点都是一个 link 结构体
//由于指针域中的指针要指向的也是一个节点,因此要声明为 Link 类型
创建链表
link * initLink()
{
//创建一个头结点
link * p=(link*)malloc(sizeof(link));
//声明一个指针指向头结点,
link * temp=p;
//生成链表
for (int i=1; i<5; i++)
{
link *a=(link*)malloc(sizeof(link));
a->elem=i;
a->next=NULL;
//此处temp->next其实就是head->next,temp->next此时指向的是a的地址。就是head->next指向a的地址
temp->next=a;
//将a的地址值赋值给temp,即temp指向了节点a。
temp=temp->next;
}
return p;
}
带头节点的链表
link * initLink()
{
//创建一个头结点
link * p=(link*)malloc(sizeof(link));
//声明一个指针指向头结点,
link * temp=p;
//生成链表
for (int i=1; i<5; i++)
{
link *a=(link*)malloc(sizeof(link));
a->elem=i;
a->next=NULL;
//此处temp->next其实就是head->next,temp->next此时指向的是a的地址。就是head->next指向a的地址
temp->next=a;
//将a的地址值赋值给temp,即temp指向了节点a。
temp=temp->next;
}
return p;
}
不带头结点的链表(带首元节点)
link * initLink()
{
link * p=NULL; //创建头指针
link * temp = (link*)malloc(sizeof(link));//创建首元节点
temp->elem = 1; //首元节点先初始化
temp->next = NULL;
p = temp; //头指针指向首元节点
//从第二个节点开始创建
for (int i=2; i<5; i++)
{
//创建一个新节点并初始化
link *a=(link*)malloc(sizeof(link));
a->elem=i;
a->next=NULL;
//将temp节点与新建立的a节点建立逻辑关系
temp->next=a;
//指针temp每次都指向新链表的最后一个节点,
//其实就是 a节点,这里写temp=a也对
temp=temp->next;
}
//返回建立的节点,只返回头指针 p即可,通过头指针即可找到整个链表
return p;
}
链表插入数据
插入思想:
虽然新元素的插入位置不固定,但是链表插入元素的思想是固定的,只需做以下两步操作,即可将新元素插入到指定的位置:
将新结点的 next 指针指向插入位置后的结点;
将插入位置前结点的 next 指针指向插入结点;
//p为原链表,elem表示新数据元素,add表示新元素要插入的位置
link * insertElem(link * p,int elem,int add)
{
link * temp=p;//创建临时结点temp
for (int i=1; i<add; i++) //首先找到要插入位置的上一个结点
{
if (temp==NULL) {
printf("插入位置无效\n");
return p;
}
temp=temp->next;
}
//创建插入结点c
link * c=(link*)malloc(sizeof(link));
c->elem=elem;
c->next=temp->next; //向链表中插入结点
temp->next=c;
return p;
}
链表删除数据
//p为原链表,add为要删除元素的值
link * delElem(link * p,int add)
{
link * temp=p;
//temp指向被删除结点的上一个结点
for (int i=1; i<add; i++)
{
temp=temp->next;
}
//单独设置一个指针指向被删除结点,以防丢失
link * del=temp->next;
//删除某个结点的方法就是更改前一个结点的指针域
temp->next=temp->next->next;
free(del);//手动释放该结点,防止内存泄漏
return p;
}
链表查找数据
//p为原链表,elem表示被查找元素、
int selectElem(link * p,int elem)
{
//新建一个指针t,初始化为头指针 p
link * t=p;
int i=1;
//由于头节点的存在,因此while中的判断为t->next
while (t->next)
{
t=t->next;
if (t->elem==elem)
{
return i;
}
i++;
}
//程序执行至此处,表示查找失败
return -1;
}
链表更新数据
//更新函数,其中,add 表示更改结点在链表中的位置,newElem 为新的数据域的值
link *amendElem(link * p,int add,int newElem)
{
link * temp=p;
//在遍历之前,temp指向首元结点
temp=temp->next;
//遍历到被删除结点
for (int i=1; i<add; i++)
{
temp=temp->next;
}
temp->elem=newElem;
return p;
}
计算链表的大小
size_t LinkListSize(LP_RECSEGMENT_INFO_V20 *head)
{
if(head==NULL)
{
return 0;
}
LP_RECSEGMENT_INFO_V20 *cur=head;
size_t size=0;
for(;*cur!=NULL;*cur=(*cur)->pNext)
{
size++;
}
if(*cur==NULL)
{
return 0;
}
return size;
}
struct Node
{
int data ;
Node *next ;
};
typedef struct Node Node ;
(1)已知链表的头结点head,写一个函数把这个链表逆序 ( Intel)
Node * ReverseList(Node *head) //链表逆序
{
if ( head == NULL || head->next == NULL )
return head;
Node *p1 = head ;
Node *p2 = p1->next ;
Node *p3 = p2->next ;
p1->next = NULL ;
while ( p3 != NULL )
{
p2->next = p1 ;
p1 = p2 ;
p2 = p3 ;
p3 = p3->next ;
}
p2->next = p1 ;
head = p2 ;
return head ;
}
(2)已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序。(保留所有结点,即便大小相同)
Node * Merge(Node *head1 , Node *head2)
{
if ( head1 == NULL)
return head2 ;
if ( head2 == NULL)
return head1 ;
Node *head = NULL ;
Node *p1 = NULL;
Node *p2 = NULL;
if ( head1->data < head2->data )
{
head = head1 ;
p1 = head1->next;
p2 = head2 ;
}
else
{
head = head2 ;
p2 = head2->next ;
p1 = head1 ;
}
Node *pcurrent = head ;
while ( p1 != NULL && p2 != NULL)
{
if ( p1->data <= p2->data )
{
pcurrent->next = p1 ;
pcurrent = p1 ;
p1 = p1->next ;
}
else
{
pcurrent->next = p2 ;
pcurrent = p2 ;
p2 = p2->next ;
}
}
if ( p1 != NULL )
pcurrent->next = p1 ;
if ( p2 != NULL )
pcurrent->next = p2 ;
return head ;
}
(3)已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序,这次要求用递归方法进行。(Autodesk)
Node * MergeRecursive(Node *head1 , Node *head2)
{
if ( head1 == NULL )
return head2 ;
if ( head2 == NULL)
return head1 ;
Node *head = NULL ;
if ( head1->data < head2->data )
{
head = head1 ;
head->next = MergeRecursive(head1->next,head2);
}
else
{
head = head2 ;
head->next = MergeRecursive(head1,head2->next);
}
return head ;
}
添加一段完整的代码块,删除兼容了删除尾结点。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
typedef struct SwiperItemNode
{
int layout_qss_val;
int play_time;
string camera_id;
string camera_name;
SwiperItemNode()
{
layout_qss_val = 0;
play_time = 0;
camera_id = "";
camera_name = "";
}
SwiperItemNode(SwiperItemNode &s)
{
layout_qss_val = s.layout_qss_val;
play_time = s.play_time;
camera_id = s.camera_id;
camera_name = s.camera_name;
}
~SwiperItemNode()
{
layout_qss_val = 0;
play_time = 0;
camera_id = "";
camera_name = "";
}
SwiperItemNode *next = NULL;
} SWIPER_ITEM_NODE;
typedef struct SwiperItemRootNode
{
string layout_name;
string label_VM_Id;
int Node_count;
SWIPER_ITEM_NODE *node_data;
SwiperItemRootNode()
{
node_data = (SWIPER_ITEM_NODE *)malloc(sizeof(SWIPER_ITEM_NODE));
layout_name = "";
label_VM_Id = "";
Node_count = 0;
node_data = NULL;
}
SwiperItemRootNode(SwiperItemRootNode &s)
{
layout_name = s.layout_name;
label_VM_Id = s.label_VM_Id;
Node_count = s.Node_count;
node_data = s.node_data;
}
~SwiperItemRootNode()
{
layout_name = "";
label_VM_Id = "";
Node_count = 0;
node_data = NULL;
}
SwiperItemRootNode *next = NULL;
} SWIPER_ITEM_ROOT_NODE;
class ItemNodeLink
{
public:
ItemNodeLink() {}
~ItemNodeLink() {}
public:
SWIPER_ITEM_ROOT_NODE *item_node;
public: //创建父链表 CURD
int create_node_link(SWIPER_ITEM_ROOT_NODE **head)
{
//创建一个头结点
//head = (SWIPER_ITEM_ROOT_NODE *)malloc(sizeof(SWIPER_ITEM_ROOT_NODE));
*head = new SWIPER_ITEM_ROOT_NODE();
if (!(head)) /* 存储分配失败 */
{
return -1;
}
(*head)->label_VM_Id = "";
(*head)->layout_name = "";
(*head)->Node_count = 0;
(*head)->node_data = NULL;
(*head)->next = NULL;
return 0;
}
int add_node_link(SWIPER_ITEM_ROOT_NODE *head, SWIPER_ITEM_NODE *data, string layout_name, string label_VM_Id)
{
//创建插入结点
//程序中的内存错误是因为使用malloc分配一个结构体内存,但是string是一个类。
//并没有调用string的构造函数,所以string在malloc之后没有正确构造,导致使用时段错误
SWIPER_ITEM_ROOT_NODE *insert_node = new SWIPER_ITEM_ROOT_NODE();
if (!insert_node)
return -1;
insert_node->layout_name = layout_name;
insert_node->label_VM_Id = label_VM_Id;
insert_node->node_data = data;
//尾插法
//使新数据成为尾结点
insert_node->next = NULL;
//创建临时结点temp,指向头结点
SWIPER_ITEM_ROOT_NODE *temp = head;
//找到链表的末端指针
while (temp->next != NULL)
{
temp = temp->next;
}
temp->next = insert_node;//使上一个数据的next指向新数据 形成链表
//头插
//将现有头的next NULL赋值给该新申请的next,使之为空即使该数据成为尾结点
//insert_node->next = head->next;
//head->next = insert_node;
return 0;
}
//考虑到删除尾结点的问题
int del_node_link(SWIPER_ITEM_ROOT_NODE **head, string label_VM_Id)
{
if (!*head)
return -1;
//创建临时结点temp,指向头结点
SWIPER_ITEM_ROOT_NODE *temp = NULL, *pre = NULL;
temp = *head;
//先判断当前节点是不是最后一个节点,如果是最后一个节点删除
while (temp->next != NULL)
{
pre = temp;
temp = temp->next;
}
if (temp->label_VM_Id == label_VM_Id)
{
free(temp);
temp = NULL;
pre->next = NULL;
return 0;
}
//不是最后一个节点,找到位置,删除
temp = *head;
int j = 0;
if (!temp)
return -1;
while (temp->next)
{
temp = temp->next;
if (temp->label_VM_Id == label_VM_Id)
{
j++;
break;
}
}
del_node_link(*head, j, label_VM_Id);
return 0;
}
//删除第pos位置的元素
int del_node_link(SWIPER_ITEM_ROOT_NODE *head, int pos, string label_VM_Id)
{
int j = 1;
//创建临时结点temp,指向头结点
SWIPER_ITEM_ROOT_NODE *temp, *pre;
temp = head;
if (!temp)
return -1;
while (temp->next && j < pos)
{
temp = temp->next;
++j;
}
/* 第pos个元素不存在 */
if (!(temp->next) || j > pos)
return -1;
pre = temp->next;
temp->next = pre->next;
DestroyList(pre->node_data);
free(pre);
return 0;
}
int select_node_link() {}
int EmptyList(SWIPER_ITEM_ROOT_NODE *head)
{
if (head->next == NULL)
return 1;
return 0;
}
void Print_List(SWIPER_ITEM_ROOT_NODE *head)//遍历打印
{
if (EmptyList(head))
return;
SWIPER_ITEM_ROOT_NODE *p = head->next;
SWIPER_ITEM_NODE* temp = NULL;
while (p)
{
printf("label id:%s \n", p->label_VM_Id.c_str());
temp = p->node_data;
Print_List(temp);
p = p->next;
}
}
int Len_Get(SWIPER_ITEM_ROOT_NODE *head, string label_VM_Id)//遍历获取长度
{
int len = 0;
//获取当前父节点的子节点是否为空。
SWIPER_ITEM_ROOT_NODE *p = head->next;
while (p != NULL)
{
if (p->label_VM_Id == label_VM_Id)
{
len = Len_Get(p->node_data);
printf("child count:%d", len);
break;
}
p = p->next;
}
return len;
}
public: //创建子链表 CURD
int create_child_node_link(SWIPER_ITEM_NODE** head)
{
//创建一个头结点
//程序中的内存错误是因为使用malloc分配一个结构体内存,但是string是一个类。
//并没有调用string的构造函数,所以string在malloc之后没有正确构造,导致使用时段错误
//head = (SWIPER_ITEM_NODE *)malloc(sizeof(SWIPER_ITEM_NODE));
*head=new SWIPER_ITEM_NODE();
(*head)->next = NULL;
(*head)->camera_id = "";
(*head)->camera_name = "";
(*head)->layout_qss_val = 0;
(*head)->play_time = 0;
return 0;
}
int add_child_node_link(SWIPER_ITEM_NODE **head, string camera_id, string camera_name,int layout_qss_val,int play_time)
{
//创建插入结点
//程序中的内存错误是因为使用malloc分配一个结构体内存,但是string是一个类。
//并没有调用string的构造函数,所以string在malloc之后没有正确构造,导致使用时段错误
SWIPER_ITEM_NODE *data = new SWIPER_ITEM_NODE();
if (!data)
return -1;
data->camera_id = camera_id;
data->camera_name = camera_name;
data->layout_qss_val = layout_qss_val;
data->play_time = play_time;
//尾插法
//使新数据成为尾结点
data->next = NULL;
//创建临时结点temp,指向头结点
SWIPER_ITEM_NODE *temp = *head;
//找到链表的末端指针
while (temp->next != NULL)
{
temp = temp->next;
}
temp->next = data;//使上一个数据的next指向新数据 形成链表
//头插
//将现有头的next NULL赋值给该新申请的next,使之为空即使该数据成为尾结点
//data->next = head->next;
//head->next = data;
return 0;
}
//任意位置插入
int add_child_node_link(SWIPER_ITEM_NODE *head,int pos, string camera_id, string camera_name, int layout_qss_val, int play_time)
{
int j=0;
//创建临时结点temp,指向头结点
SWIPER_ITEM_NODE *temp = head ;
SWIPER_ITEM_NODE *data = new SWIPER_ITEM_NODE();
if (!data)
return -1;
data->camera_id = camera_id;
data->camera_name = camera_name;
data->layout_qss_val = layout_qss_val;
data->play_time = play_time;
while (temp && j < (pos-1))
{
temp = temp->next;
++j;
}
/* 第pos个元素不存在 */
if (!temp || j > (pos-1))
return -1;
data->next = temp->next;
temp->next = data;
//也可以
//SWIPER_ITEM_NODE *pre;
//pre = temp->next;
//temp->next = data;
//data->next = pre;
return 0;
}
//考虑到删除尾结点的问题
int del_child_node_link(SWIPER_ITEM_NODE **head, string camera_id)
{
if (!*head)
return -1;
//创建临时结点temp,指向头结点
SWIPER_ITEM_NODE *temp=NULL, *pre=NULL;
temp = *head;
//先判断当前节点是不是最后一个节点,如果是最后一个节点删除
while (temp->next != NULL)
{
pre = temp;
temp = temp->next;
}
if (temp->camera_id == camera_id)
{
free(temp);
temp = NULL;
pre->next = NULL;
return 0;
}
//不是最后一个节点,找到位置,删除
temp = *head;
int j = 0;
if (!temp)
return -1;
while (temp->next)
{
temp = temp->next;
if (temp->camera_id == camera_id)
{
j++;
break;
}
}
del_child_node_link(*head, j, camera_id);
return 0;
}
private:
//删除第pos位置的元素
int del_child_node_link(SWIPER_ITEM_NODE *head,int pos, string camera_id)
{
int j=1;
//创建临时结点temp,指向头结点
SWIPER_ITEM_NODE *temp, *pre;
temp = head;
if (!temp)
return -1;
while (temp->next && j<pos)
{
temp = temp->next;
++j;
}
/* 第pos个元素不存在 */
if (!(temp->next) || j > pos)
return -1;
pre = temp->next;
temp->next = pre->next;
free(pre);
return 0;
}
int select_child_node_link() {}
int EmptyList(SWIPER_ITEM_NODE *head)
{
if (head->next == NULL)
return 1;
return 0;
}
//销毁链表
int DestroyList(SWIPER_ITEM_NODE *head)
{
SWIPER_ITEM_NODE *temp;
if (head == NULL)
return -1;
while (head)
{
temp = head->next;
free(head);
head = temp;
}
return 0;
}
//清空链表
int ClearList(SWIPER_ITEM_NODE *head)
{
SWIPER_ITEM_NODE *temp, *pre;
if (head == NULL)
return 0;
temp = head->next;
while (temp != NULL)
{
pre = temp->next;
free(temp);
temp = pre;
}
head->next = NULL;
return 1;
}
public:
void Print_List(SWIPER_ITEM_NODE *head)//遍历打印
{
if (EmptyList(head))
return;
SWIPER_ITEM_NODE *p = head->next;
while (p)
{
printf("camera id:%s \n", p->camera_id.c_str());
p = p->next;
}
}
int Len_Get(SWIPER_ITEM_NODE *head)//遍历获取长度
{
int len = 0;
SWIPER_ITEM_NODE *p = head->next;
while (p)
{
p = p->next;
len++;
}
return len;
}
void List_Reverse(SWIPER_ITEM_NODE* head)//链表转置
{
if (EmptyList(head))return;
SWIPER_ITEM_NODE *p1, *p2, *p3;
p1 = head->next;
p2 = p1->next;
p3 = p2->next;
head->next = NULL;
p1->next = NULL;
while (p3->next)
{
p2->next = p1;
p1 = p2;
p2 = p3;
p3 = p2->next;
}
p2->next = p1;
p3->next = p2;
head->next = p3;
}
};
int main()
{
printf("hello world\n");
ItemNodeLink *item = new ItemNodeLink();
SWIPER_ITEM_ROOT_NODE *head = NULL; //父链表
SWIPER_ITEM_NODE *child = NULL; //子链表
int ret = item->create_node_link(&head); //创建空的父链表
int childRet = item->create_child_node_link(&child);
printf("create linknode ret====:%d \n", ret);
printf("create child linknode childRet====:%d \n", childRet);
childRet = item->add_child_node_link(&child,"123123","huawei",4,30);
childRet = item->add_child_node_link(&child, "456456", "hiki", 13, 30);
childRet = item->add_child_node_link(&child, "789789", "yushi", 13, 30);
childRet = item->add_child_node_link(&child, "123789", "yushi", 13, 30);
printf("child add-------------------------\n");
item->Print_List(child);
//item->add_child_node_link(child, 3, "785785", "huawei", 4, 30);
//printf("add-------------------------\n");
//item->Print_List(child);
//item->del_child_node_link(&child, "123123");
//printf("del-------------------------\n");
//item->Print_List(child);
//item->del_child_node_link(&child, "123789");
//printf("del-------------------------\n");
//item->Print_List(child);
//item->del_child_node_link(child, 2, "");
//printf("del-------------------------\n");
//item->Print_List(child);
//item->List_Reverse(child);
//printf("tre-------------------------\n");
//item->Print_List(child);
int count=item->add_node_link(head,child,"layout1","78978931");
printf("parent add-------------------------\n");
item->Print_List(head);
count = item->add_node_link(head, child, "layout2", "12378595");
printf("parent add-------------------------\n");
item->Print_List(head);
count = item->add_node_link(head, child, "layout3", "45678595");
printf("parent add-------------------------\n");
item->Print_List(head);
item->del_node_link(&head,"45678595");
printf("parent del-------------------------\n");
item->Print_List(head);
//获取当前父节点的子节点是否为空。
SWIPER_ITEM_ROOT_NODE *p = head->next;
while (p!=NULL)
{
count = item->Len_Get(p->node_data);
printf("child count:%d", count);
p = p->next;
}
system("pause");
if (head != NULL)
{
delete head;
head = NULL;
}
if (child != NULL)
{
delete child;
child = NULL;
}
return 0;
}