鏈表的常見操作
鏈表是數據結構的重要內容
以下簡單實現了鏈表的一些操作
一
鏈表主要有三種形式
單鏈表每個節點只包含一個後驅指針
代碼如下
/*單鏈表節點結構*/
typedef struct NodeType
{
char elem;
NodeType*next;
}Node;
/*雙鏈表節點結構*/
typedef struct DNodeType
{
char elem;
DNodeType*next;
DNodeType*prev;
}DNode;
/*
創建鏈表
*/
Node* CreateList(Node*head)
{
if(NULL== head)//分配頭節點空間
head=(Node*)malloc(sizeof(Node))
head
Node*current=head
char ch;
while(
{
cout<<
cin>>ch;
if(
break;
temp=(Node*) malloc (sizeof(Node) );
temp
temp
current
current=temp;/*當前節點為鏈表尾節點*/
}
return head;
}
/*創建雙鏈表*/
DNode* DoubleList(DNode*head)
{
if(NULL== head)//分配頭節點空間
head=(DNode*)malloc(sizeof(DNode))
DNode*current=head
char ch;
while(
{
cout<<
cin>>ch;
if(
break;
temp=(DNode*) malloc (sizeof(DNode) );
temp
temp
current
temp
current=temp;/*當前節點為鏈表尾節點*/
}
return head;
}
/*創建循環鏈表*/
Node* CycleList(Node*head)
{
if(NULL== head)/*分配頭節點空間*/
head=(Node*)malloc(sizeof(Node))
Node*current=head
char ch;
while(
{
cout<<
cin>>ch;
if(
break;
temp=(Node*) malloc (sizeof(Node) );
temp
temp
current
current=temp;/*當前節點為鏈表尾節點*/
}
current
return head;
}
二
包括單鏈表的增加節點
添加節點
/*插入節點*/
Node*InsertNode(Node*head
{
if( NULL== head|| NULL== elem )
return head;
Node*current=head
Node*prev=head;/*前驅節點*/
Node*temp;/*過渡節點*/
while(current)/*移動至尾節點*/
{
prev=current;
current=current
}
temp=(Node*) malloc(sizeof(Node) );
temp
temp
prev
return head;
}
/*
輸出鏈表
*/
void PrintList(Node*head)
{
Node* current=head
cout<<
while(NULL!= current)
{
if(NULL!= current
cout<<setw(
current=current
}
cout<<
}
三
單鏈表逆置在各公司的筆試題中比較常見
算法描述
代碼如下
單鏈表逆置/*單鏈表逆置*/
Node*ReverseList(Node*head)
{
if(NULL== head)
return head;
if(NULL== head
return head;
if(NULL== head
return head;
Node*curr=head
head
Node*temp;
while(curr)
{
temp=curr
/*把當前節點插入到head節點後*/
curr
head
curr=temp;/*移動至下一個節點*/
}
return head;
}
四
在筆試題中比較常見
算法描述
代碼如下
求中間節點
/*求中間節點*/
Node* MiddleNode(Node*head)
{
if(NULL== head)
return head;
if(NULL== head
return head
Node*p
p
p
while(p
{
/*p
p
if(p
p
/*p
p
}
return p
}
五
問題描述
算法描述
代碼如下
合並有序單鏈表/*合並有序單鏈表*/
Node* MergeList(Node* h
{
if(NULL== h
return h
if(NULL== h
return h
if(NULL== h
return h
Node* curr
prev
curr
curr
temp=h
while(curr
{
while(curr
prev
/*在鏈表
temp=curr
prev
curr
/*鏈表
curr
/*鏈表
curr
}
return h
}
六
判斷鏈表是否有環即是判斷鏈表是否為循環鏈表
代碼如下
/*判斷鏈表是否有環(循環鏈表)*/
bool IsCycleList(Node*head)
{
if(NULL== head)
return false;
if(NULL== head
return false;
Node*current=head
while(current)
{
if(head== current
return true;
current=current
}
return false;
}
七
以上實現了鏈表的一些常見操作
/*
* 作者
* 修改日期
* 描述
*
*/
#include<iostream>
#include<iomanip>
using namespace std;
/*單鏈表節點結構*/
typedefstruct NodeType
{
char elem;
NodeType*next;
}Node;
/*雙鏈表節點結構*/
typedefstruct DNodeType
{
char elem;
DNodeType*next;
DNodeType*prev;
}DNode;
/*=============================================================================*/
/*
創建鏈表
*/
Node* CreateList(Node*head)
{
if(NULL== head)//分配頭節點空間
head=(Node*)malloc(sizeof(Node))
head
Node*current=head
char ch;
while(
{
cout<<
cin>>ch;
if(
break;
temp=(Node*) malloc (sizeof(Node) );
temp
temp
current
current=temp;/*當前節點為鏈表尾節點*/
}
return head;
}
/*=============================================================================*/
/*
輸出鏈表
*/
void PrintList(Node*head)
{
Node* current=head
cout<<
while(NULL!= current)
{
if(NULL!= current
cout<<setw(
current=current
}
cout<<
}
/*=============================================================================*/
/*插入節點*/
Node*InsertNode(Node*head
{
if( NULL== head|| NULL== elem )
return head;
Node*current=head
Node*prev=head;/*前驅節點*/
Node*temp;/*過渡節點*/
while(current)/*移動至尾節點*/
{
prev=current;
current=current
}
temp=(Node*) malloc(sizeof(Node) );
temp
temp
prev
return head;
}
/*=============================================================================*/
/*刪除節點*/
Node*DeleteNode(Node*head
{
if(NULL== head|| NULL== elem)
return head;
if(NULL== head
return head;
Node*prev
prev=head;
current=head
while(current)
{
if(current
{
prev
free(current);/*釋放當前節點*/
return head;
}
prev=current;
current=current
}
return head;
}
/*=============================================================================*/
/*單鏈表逆置*/
Node*ReverseList(Node*head)
{
if(NULL== head)
return head;
if(NULL== head
return head;
if(NULL== head
return head;
Node*curr=head
head
Node*temp;
while(curr)
{
temp=curr
/*把當前節點插入到head節點後*/
curr
head
curr=temp;/*移動至下一個節點*/
}
return head;
}
/*=============================================================================*/
/*求中間節點*/
Node* MiddleNode(Node*head)
{
if(NULL== head)
return head;
if(NULL== head
return head
Node*p
p
p
while(p
{
/*p
p
if(p
p
/*p
p
}
return p
}
/*=============================================================================*/
/*合並有序單鏈表*/
Node* MergeList(Node* h
{
if(NULL== h
return h
if(NULL== h
return h
if(NULL== h
return h
Node* curr
prev
curr
curr
temp=h
while(curr
{
while(curr
prev
/*在鏈表
temp=curr
prev
curr
/*鏈表
curr
/*鏈表
curr
}
return h
}
/*=============================================================================*/
/*創建雙鏈表*/
DNode* DoubleList(DNode*head)
{
if(NULL== head)//分配頭節點空間
head=(DNode*)malloc(sizeof(DNode))
DNode*current=head
char ch;
while(
{
cout<<
cin>>ch;
if(
break;
temp=(DNode*) malloc (sizeof(DNode) );
temp
temp
current
temp
current=temp;/*當前節點為鏈表尾節點*/
}
return head;
}
/*=============================================================================*/
/*輸出雙鏈表*/
void PrintDoubleList(DNode*head)
{
if(NULL== head)
return;
DNode* p;
p=head;
cout<<
while(p
{
p=p
if(p
cout<<setw(
}
cout<<
while(p
{
if(p
cout<<setw(
p=p
}
}
/*=============================================================================*/
/*創建循環鏈表*/
Node* CycleList(Node*head)
{
if(NULL== head)/*分配頭節點空間*/
head=(Node*)malloc(sizeof(Node))
Node*current=head
char ch;
while(
{
cout<<
cin>>ch;
if(
break;
temp=(Node*) malloc (sizeof(Node) );
temp
temp
current
current=temp;/*當前節點為鏈表尾節點*/
}
current
return head;
}
/*=============================================================================*/
/*判斷鏈表是否有環(循環鏈表)*/
bool IsCycleList(Node*head)
{
if(NULL== head)
return false;
if(NULL== head
return false;
Node*current=head
while(current)
{
if(head== current
return true;
current=current
}
return false;
}
int main()
{
Node* head
Node* head
DNode* dHead;
char ch;
head= NULL;
head
head
dHead=NULL;
//head=(Node*) malloc ( sizeof( Node) );
//head
//創建單鏈表
head=CreateList(head);
PrintList(head);
head
PrintList(head
//插入節點
cout<<
cin>>ch;
InsertNode(head
PrintList(head);
//刪除節點
cout<<
cin>>ch;
DeleteNode(head
PrintList(head);
//單鏈表逆置
head=ReverseList(head);
cout<<
PrintList(head);
//求中間節點
p=MiddleNode(head);
cout<<
cout<<p
//合並有序單鏈表
MergeList(head
cout<<
PrintList(head);
//創建雙鏈表
dHead=DoubleList(dHead);
PrintDoubleList(dHead);
/*創建循環鏈表並判斷是否有環*/
head
cout<<IsCycleList(head
return
}
From:http://tw.wingwit.com/Article/program/sjjg/201404/30581.html