下面的代码完成的算法有:
- 建立空表
- 初始化一个任意长度的链表(尾插法)
- 查找
- 插入
- 删除
一开始使用的是没有前哨结点的链表来完成,也确实实现了,但是此方法表头的插入、删除操作需要另外讨论(不爽)。故使用有前哨结点的链表改了一下,代码简洁了很多。
**注意:**主函数要求你自己输入链表的各项值,9999结束输入
#include<iostream>
typedef int ElementType ;
using namespace std;
typedef struct Lnode* List;
/*请输入链表元素,9999结束输入*/
struct Lnode {
ElementType data;
List next;
};
List Init()
{
List head;
head = (List)malloc( sizeof( struct Lnode ) );//头指针及哨位结点的定义
// head->data = 0;
head->next = NULL;
return head;
}
List Create()
{
List head,p,tail;
head = (List)malloc( sizeof( struct Lnode ) );
head->next = NULL;
tail = head;
while( 1 ){
int x;
cin>>x;
if( x==9999 )
break;
p = (List)malloc( sizeof( struct Lnode ) );
p->data = x;
p->next = tail->next;
tail->next = p;
tail = p;
}
return head;
}
int Length( List ptrl )
{
List p= ptrl;
int i = 0;
while( p->next ){
p = p->next;
i++;
}
return i;
}
List Findth( List ptrl , int k ) //寻找链表第k处的值
{
List p = ptrl;
int i = 0;
while( p!=NULL && i<k ){
p = p->next ;
i++;
}
if( p == NULL )
return NULL;
else
return p;
}
List Find ( List ptrl , ElementType x )
{
List p = ptrl;
int i = 1;
while( p ){
if( p->data == x )
break;
p = p->next ;
}
if( p == NULL )
return NULL;
else
return p;
}
List Insert ( List ptrl , int i , ElementType x )//在链表的第i处插入一个结点
{
List p,s,f;
// if( i==1 && ptrl->next==NULL){
// s = (List)malloc( sizeof( struct Lnode ) );
// s->next = NULL;
// s->data = x;
// ptrl->next = s;
// return s;
// }
//
// if( i==1 && ptrl->next!=NULL){ //i==1的时候,特殊处理。
// s = (List)malloc( sizeof( struct Lnode ) );
// s->next = ptrl->next;
// s->data = x;
// ptrl->next = s;
// return ptrl;
// }
p = Findth( ptrl, i-1 );
if( p==NULL ){
cout<<"参数"<<i<<"位置不合法"<<endl;
return NULL;
}else{
s = (List)malloc( sizeof( struct Lnode ) );
s->data = x;
s->next = p->next; //注意:此行与下一行不能调换顺序。
p->next = s;
return ptrl;
}
}
List Delete ( List ptrl, int i ) //删除链表第i处的结点
{
List p,s;
// if( i == 1 ){
// s = ptrl;
// if( p!=NULL ){
// p = p->next;
// }else{
// return NULL;
// }
// free( s );
// return ptrl;
// }
p = Findth( ptrl, i-1 );
if( p==NULL ||p->next==NULL ){
cout<<"参数"<<i<<"位置不合法"<<endl;
return NULL;
}else{
s = p->next;
p->next = s->next;
free(s);
return ptrl;
}
}
void print(List ptrl)
{
List p = ptrl->next; //由于哨位结点的存在,从哨位结点的后一位开始为有效数据
if( p==NULL ){
cout<<"此表为空"<<endl;
}else{
while( p!=NULL ){
cout<<p->data<<endl;
p = p->next;
}
}
}
int main()
{
List list1 = Init();
List list2 = Create();
print(list1);
print(list2);
Insert( list1, 1, 11 );
Insert( list1, 2, 22 );
Insert( list1, 3, 33 );
Insert( list1, 4, 44 );
cout<<Find( list1, 33)->next->data<<endl;
cout<<"-----------------------"<<endl;
cout<<Findth(list1,2)->data<<endl;
print(list1);
cout<<Length(list1)<<endl;
Insert( list1, 2, 222 );
print(list1);
cout<<"-----------------------"<<endl;
Delete(list1,1);
print(list1);
cout<<endl;
Delete(list1,4);
print(list1);
return 0;
}
运行结果: