一、单链表的结点数据类型
typedef int DataType;
struct Node
{
DataTpye data;
struct Node *next; //next为指向下一结点的指针
};
二、初始化单链表
int InitList(Node *&H)
{
H = new Node; //分配空间,作为头结点
if(!H)
{
cout<<"初始化错误"<<endl;
return 0;
}
H->next = NULL;
return 1;
}
三、判表空
int ListEmpty(Node *H)
{
if(H->next)
{
return 0;
}
else
{
return 1;
}
}
四、求单链表中当前元素的个数
int ListLength(Node *H)
{
Node *p = H->next;
int total;
while(p)
{
total++;
p=p->next;
}
return total;
}
五、遍历单链表
void TraveseList(Node *H)
{
Node *p = H->next;
while(p)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
六、查找指定节点
int Find_item(Node *H,DataType item)
{
Node *p = H->next;
int pos = 0;
while(p)
{
pos++;
if(p->data==item)
{
break;
}
p=p->next;
}
if(p)
{
return pos;
}
else
{
return 0;
}
}
七、获取单链表上指定的元素
int Find_pos(Node *H,int pos,DataType *item)
{
Node *p=H->next;
int i=1;
while(p&&i!=pos) //判断插入查找是否有效
{
i++;
p=p->next;
}
if(p==NULL)
{
cout<<"位置无效"<<endl;
}
else
{
*item=p->data;
}
return 1;
}
八、单链表的建立
A.链表表头插入法建立单链表
void CreateListF(Node *&H,DataType a[],int n)
{
for(int i=0;i<n;i++)
{
Node *t=new Node;
t->data=a[i];
t->next=H->next;
H->next=t;
}
}
B.尾插法建表
void CreateListR(Node *&H,DataType a[],int n)
{
int i;
Node *r=H;
while(r->next) //找到尾7结点
{
r=r->next;
}
for(int i=0;i<n;i++)
{
Node *t=new Node;
t->data=a[i];
r->next=t; //连接
r=t; //指针r移动到尾结点
}
}
C.链表任意位置插入法建立单链表(必须找到所插位置的前一个结点,再进行插入)
int ListInsert(Node *&H,int pos,DataType item)
{
Node *p=H;
int pos=1;
while(p)
{
if(i==pos)
{
break;
}
p=p->next;
}
if(p==NULL)
{
cout<<"插入位置无效!"<<endl;
return 0;
}
Node *t=new Node;
t->data=item;
t->next=p->next;
p-next=t;
return 1;
}
九、从单链表中删除指定位置的结点
int ListDelete_pos(Node *&H,int pos,DataType *item)
{
Node *p=H;
Node *t=new Node;
int i=1;
while(p)
{
if(i==pos)
{
break;
}
p=p->next;
}
if(p==NULL)
{
cout<<"删除位置无效"<<endl
return 0;
}
t=p->next;
item=t->data;
p->next=t->next;
delete t;
return 1;
}
十、从线性表中删除一个与指定值匹配的元素
int ListDelete_item(Node *&H,DataType item)
{
Node *p=H;
Node *t;
while(p->next)
{
if(p->next->data==item)
{
break;
}
p=p->next;
}
if(p->next==NULL)
{
cout<<"删除元素不存在!"<<endl;
return 0;
}
t=p->next;
p->next=t->next;
delete t;
return 1;
}
十一、撤销单链表
void Destroy(Node *&H)
{
Node *p //借助一个指针指向链表中的元素进行删除
while(H)
{
p=H;
H=H->next; //从开头一个一个删除,每删除一个链表头指针就往后一个位置
delete p;
}
}
▲循环链表(链表中的最后一个结点指向头结点)
单链表 | 循环链表 | |
判表空 | head->next=NULL | head->next=head |
判表尾 | p->next=NULL | p->next=head |
建空表 | head->next=NULL | head->next=head |