一个简单的链表的实现

最近在看算法导论, 觉得有些东西可以记录下-》这篇文章只是为了记录。

 

1. 链表的特点

链表是一个非常常用的数据结构,其有如下几个基本特点:

1. 其内存空间是线性但是非连续的。

2. 对于插入和删除有O(1)的时间复杂度

3. 不能被索引化

4. 查找慢

 

2. 简单的链表实现

2.1 链表的内存模型

一个典型的双向链表包含一个关键字域,一个前驱,一个后继。

其结构源码如下所示:

 typedef struct _List 
{
	_List*	prev;
	int		value;
	_List*	next;
}List;

 

 

 

2.2 链表的创建

下面是一个创建n个节点的链表。

 List* list_create( int n)
{
	List *head , *current;
	
	head = new List;
	head->value = 0;
	current = head;
	current->prev = NULL;

	List* temp;
	for (int i = 1; i < n; ++i)
	{
		// i0
		temp =  new List;
		temp->value = i;
		temp->prev = current;
		current->next = temp;

		//i1
		current = current->next;
	}

	current->next = NULL;

	return head;
}

 

 2.3 节点的查找

 List* list_find(List*list, int value)
{
	List* current = list;
	while (current->next != NULL && current->value != value)
		current = current->next;

	return current;
}


时间复杂度为O(n), 这里能看出链表的查找为什么慢了。

 

2.4 链表的插入

 List* list_insert(List* list, List* current, List* node)
{
    if (current->prev == NULL)
    {
        current->prev = node;
        node->prev = NULL;
        node->next = current; 

        return node;
    }
    else if (current->next == NULL)
    {
        current->next = node;
        node->prev = current;
        node->next =NULL;
    }
    else
    {
        List* temp = current->next; 

        node->prev =current;
        node->next = temp; 

        current->next = node; 

        temp->prev = node;
    }
    return list;
} 

 

时间复杂度为O(1).

 

2.5 链表的删除

 void list_delete(List*node)
{
	if (node->prev == NULL)
	{	
		node->next->prev = NULL;
		node->next = NULL;
		delete node;
	}
	else if (node->next == NULL)
	{
		node->prev->next = NULL;
		node->prev = NULL;

		delete node;
	}
	else
	{
		node->prev->next = node->next;
		node->next->prev = node->prev;

		node->prev = NULL;
		node->next = NULL;
		delete node;
	}
}


时间复杂度为O(1);

2.6 测试代码

 #include "stdafx.h"
#include "List.h"
#include <iostream>
using namespace std; 

int _tmain(int argc, _TCHAR* argv[])
{
    //test for create
    List* listnode = list_create(10); 

    //test for find
    cout<< "find" <<endl;
    List* findnode = list_find(listnode, 5);
    cout<< findnode->value<<endl; 

    // test for insert
    List* newnode = new List;
    newnode->value    = 100;
    cout << "insert middle" <<endl;
    List* newlsit = list_insert(listnode,findnode, newnode); 

    cout << "insert begin"<<endl;
    newlsit = list_insert(listnode,listnode,newnode);
    for (int i = 0; i < 11; ++i)
    {
        cout<<newlsit->value<<endl;
        newlsit = newlsit->next;
    }
    //test for delete
    cout <<"delete"<<endl;
    list_delete(findnode);
    for (int i = 0; i < 11; ++i)
    {
        cout<<listnode->value<<endl;
        listnode = listnode->next;
    }
    return 0;
}

 

 

3 . 小结

    这篇文章的主要目的就是为了把写的东西记录下来, 现在记录完毕了。

转载于:https://www.cnblogs.com/sld666666/archive/2010/07/17/1779640.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值