C++ 链表实现

#include 
   
   
    
    
#include 
    
    
     
     
//#include 
     
     
      
      

using namespace std;

typedef int DataType;

typedef struct node
{
	DataType data;
	node *next;
}linkNode;

//链表初始化
/**初始化链表头部指针需要用二级指针或者一级指针的引用**/
void linkList_init(linkNode **head)   
{
	*head = (linkNode *)malloc(sizeof(linkNode));
	(*head)->next = NULL;
}
/*
void linkList_init1(linkNode *&head)
{
	head = (linkNode *)malloc(sizeof(linkNode));
	head = NULL;
}
*/
//取得元素
int linkList_getElem(linkNode *head, int i)
{
	linkNode *p;
	p = head;
	int j = -1;
	while(p->next != NULL && j < i)
	{
		p = p->next;
		j++;
	}

	if(j != i)
	{
		cout << "func linkList_getElem err" << endl;
		return 0;
	}

	return p->data;
}

//插入数据
int linklist_insert(linkNode *head, int i, DataType elem)
{
	linkNode *p, *q;
	p = head;

	int j = -1;
	while(p->next != NULL && j < i-1)
	{
		p = p->next;
		//++j;
		j++;
	}

	//判断
	if(j != i-1)
	{
		cout << "func linklist_insert err" << endl;
		return 0;
	}

	q = (linkNode *)malloc(sizeof(linkNode));  //申请一个节点
	q->data = elem;
	q->next = p->next;
	p->next = q;

	return 1;
}

//删除元素
int linkList_delete(linkNode *head, int i)
{
	linkNode *p, *q;
	p = head;
	
	int j = -1;
	while(p->next != NULL && j < i-1)
	{
		p = p->next;
		j++;
	}

	if(j != i-1)
	{
		cout << "func linkList_delete err" << endl;
		return -1;
	}

	q = p->next;
	//x = p->data;
	p->next = p->next->next;
	free(q);

	return 1;
}

//取得链表中元素个数
int linkList_length(linkNode *head)
{
	linkNode *p;
	p = head;
	int length = 0;

	while(p->next != NULL)
	{
		p = p->next;
		length++;
	}
	return length;
}

//销毁链表
/**销毁链表需要用到二级指针或者一级指针的引用**/
void linkList_destroy(linkNode **head)
{
	linkNode *p, *q;
	p = *head;
	while(p != NULL)
	{
		q = p;
		p = p->next;
		free(q);
	}
	*head = NULL;
}
/*
void linkList_init(linkNode **head)   
{
	*head = (linkNode *)malloc(sizeof(linkNode));
	(*head)->next = NULL;
}
*/
int main()
{
	linkNode *mylist;  //定义mylist是一个指针
	/**而 &mylist 是指向mylist的指针(二级指针),linkList_init()函数中head是二级指针(指针的指针),通过把&mylist传递给函数,
	此时二级指针head是指向mylist的指针(head = &mylist),对*head的操作其实就是对mylist的操作
	**/
	linkList_init(&mylist);   // 初始化链表 /***需要对头指针作出修改,所以要定义二级指针(指针的指针)
	//mylist = (linkNode *)malloc(sizeof(linkNode));

	//插入数据
	for(int i=0; i<10; i++)
	{
		linklist_insert(mylist, i, i+1);
	}
	//cout << linkList_length(mylist);

	//取得所有元素
	for(int i=0; iList_length(mylist); i++)
	{
		int x = linkList_getElem(mylist, i);
		cout << x << " ";
	}
	cout << endl;

	linkList_delete(mylist, 3);
	for(int i=0; iList_length(mylist); i++)
	{
		int x = linkList_getElem(mylist, i);
		cout << x << " ";
	}
	cout << endl;
	
	return 0;
}

     
     
    
    
   
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值