1、链表的定义。
线性表的顺序存储的方式要求逻辑上相邻的元素在物理位置上也相邻。因而可以随机的访问顺序表中的任意元素。但是要插入或者删除一个元素需要大量的移动其他的元素。正是由于上述链表的顺序存储的缺点,提出了线性表的链式存储的方式,来改进插入或者删除带来的负面效应。但是,由于线性表的链式存储的方式并不要求逻辑上相邻的元素在物理位置上也相邻。因此,链式存储的线性表失去了随机访问线性表的元素的特性。
2、实现。
2-1、创建链表。
2-2、指定位置插入元素。
2-3、删除指定位置元素。
2-4、销毁链表。//To do
typedef struct ListEle
{
unsigned data_;
ListEle* next_;
ListEle(unsigned value):
data_(value),
next_(nullptr)
{
}
}ListNode,*LinKList;
bool createListWithSize(LinKList& list,size_t n)
{
LinKList p=list;
ListNode* curNode=nullptr;
//尾插法建立链表
for(size_t i=0;i<n;++i)
{
curNode=new ListNode(i);
p->next_=curNode;
p=p->next_;
}
return true;
}
bool insertAEle(LinKList& list,size_t pos,int value)
{
if(list==nullptr)
return false;
size_t curPos=0;
ListNode* curNodePre=list;
ListNode* curNode=list->next_;
while(nullptr!=curNode&&curPos<pos)
{
curPos++;
curNodePre=curNode;
curNode=curNode->next_;
}
if(curPos!=pos)
return false;
ListNode* newNode=new ListNode(value);
newNode->next_=curNode;
curNodePre->next_=newNode;
return true;
}
bool deleteSpecPosEle(LinKList& list,size_t pos,int& value)
{
if(list==nullptr)
return false;
size_t curPos=0;
ListNode* curNodePre=list;
ListNode* curNode=list->next_;
while(nullptr!=curNode&&curPos<pos)
{
curPos++;
curNodePre=curNode;
curNode=curNode->next_;
}
if(curPos!=pos||curNode==nullptr)
return false;
value=curNode->data_;
curNodePre->next_=curNode->next_;
delete curNode;
curNode=nullptr;
return true;
}
void destroyAList(LinKList& L)
{
//To do
}
void showList(const LinKList& list)
{
if(!list)
return;
LinKList curNode=list->next_;
while(nullptr!=curNode)
{
std::cout<<curNode->data_<<"\t";
curNode=curNode->next_;
}
std::cout<<std::endl;
}
//测试函数
int main()
{
ListNode node(0);
LinKList head=&node;
createListWithSize(head,100);
std::cout<<"before operation:\n";
showList(head);
insertAEle(head,6,1234);
std::cout<<"after opearation 1:\n";
showList(head);
int a=-1;
deleteSpecPosEle(head,7,a);
std::cout<<a<<std::endl;
std::cout<<"after opearation 2:\n";
showList(head);
return 0;
}
3、运行截图。