数据结构 数据表 学习笔记

数据结构学习笔记
线性表
概念
全名为线性存储结构。使用线性表存储数据的方式可以这样理解,即“把所有数据用一根线儿串起来,再存储到物理空间中”
分类
将数据依次存储在连续的整块物理空间中,这种存储结构称为顺序存储结构(简称顺序表)
数据分散的存储在物理空间中,通过一根线保存着它们之间的逻辑关系,这种存储结构称为链式存储结构(简称链表)
顺序表
概念
顺序表对数据的物理存储结构也有要求。顺序表存储数据时,会提前申请一整块足够大小的物理空间,然后将数据依次存储起来,存储时做到数据元素之间不留一丝缝隙。如图
在这里插入图片描述
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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值