链表的基本操作

链表的基本操作:

1 创建链表 Linknode * createLink( int n )

2 求链表的长度 int lenthLink( Linknode *head )

3 链表的 插入 Linknode *insertNode( Linknode *head,int data,int key )

4 删除链表的结点 Linknode *deleteNode(Linknode *head,int num);

5 链表的排序 Linknode *sortLink(Linknode *head);
6 链表的逆序 Linknode *invertLink(Linknode *head);

7 链表的某一个节点的查找 Linknode *locateN(Linknode *head,int num);
8 输出链表 void printLink( Linknode *head )


1 创建链表

Linknode * createLink( int n )
{
int xValue;
Linknode *head,*p,*pre; //pre 和p建立连接的关系

cout<<"请输入第1个数字: ";
cin>>xValue;
p=(Linknode*)malloc(sizeof(Linknode));
p->data=xValue;
p->next=NULL;
head=p;
pre=p;

for(int i=1;i<n;i++)
{
cout<<"请输入第"<<i+1<<"个数字: ";
cin>>xValue;
p=(Linknode*)malloc(sizeof(Linknode));
p->data=xValue;
p->next=NULL;

pre->next=p;
pre=p;
}

printLink(head);
return head;
}


2 求链表的长度

int lenthLink( Linknode *head )
{
assert(head);
int num=0;
Linknode* p=head;

while(p)
{
num++;
p=p->next;
}

return num;
}


3 链表的 插入

Linknode *insertNode( Linknode *head,int data,int key )
{
assert(head!=NULL);
Linknode *s;
s=(Linknode*)malloc(sizeof(Linknode));
assert(s!=NULL);
s->data=data;
s->next=NULL;

Linknode *p=head;
//两种结果: 1 找到(执行插入) 2没找到(不执行插入)
while(p&&p->data!=key)
{
p=p->next;
}
if(p!=NULL&&p->data==key)
{
s->next=p->next;
p->next=s;
cout<<"插入成功了!!!"<<endl;
}
else
{
cout<<"插入失败!!!"<<endl;
}

printLink(head);
return head;
}


4 删除链表的结点

Linknode * deleteNode( Linknode *head,int num )
{
assert(head!=NULL);
Linknode *p=head;
Linknode *pre=head;
int n=1; //n=0 是不对的

while(p&&n<num)
{
n++;
pre=p;
p=p->next;
}
if(n!=num)
{
cout<<"删除失败!!!"<<endl;
}
else
{
pre->next=p->next;
free(p);
p=NULL;
cout<<"删除成功!!!"<<endl;
printLink(head);
}
return head;
}


5 链表的排序

//排序的话,只要改变linknode->data就可以了,链接关系不用管的。
Linknode * sortLink( Linknode *head )
{
assert(head!=NULL);
//Linknode *p=head;
int tmp;
for(Linknode *p1=head;p1!=NULL;p1=p1->next)
{
for(Linknode *p2=p1->next;p2!=NULL;p2=p2->next)
{
//交换排序(其实就是冒泡排序的了)
if(p1->data>p2->data)
{
tmp=p1->data;
p1->data=p2->data;
p2->data=tmp;
}
}
}

printLink(head);
return head;
}


6 链表的逆序

Linknode * invertLink( Linknode *head )
{
assert(head!=NULL);
Linknode *p,*pre,*tmp; //pre和p 建立连接的关系,q保持p的下一个移动的结点
p=head;
tmp=head;
pre=NULL;

while(p!=NULL)
{
tmp=p->next;
p->next=pre; //1 建立连接关系
pre=p; //2 (pre和p)往后面移动
p=tmp;
}

head=pre;
printLink(head);
return head;
}


下面是 使用递归的方法来做到:

Linknode * invertLink_Recursive( Linknode *head )
{
    Linknode* new_head=head;
    if(head==NULL || head->next==NULL)
        return head;
                      
    new_head = invertLink_Recursive(head->next);
    cout<<"输出"<<head->data<<endl;
    head->next->next=head;
    head->next=NULL;     //防止链表成为一个环,对于头结点而言的
    return new_head;
}



直接逆序输出 节点的数值

//1 退出条件  2 递归   3 最后的输出
void printInverseLink( Linknode *head )
{
    if(head==NULL)
        return;
    //cout<<head->data<<endl;
    printInverseLink(head->next);
    cout<<head->data<<endl;
}


7 链表的某一个节点的查找

Linknode* locateN( Linknode *head,int num )
{
assert(head!=NULL);
Linknode *p=head;
int n=1; //int n=0 是错误的(好好考虑这一点)

while(p!=NULL&&n<num)
{
n++;
p=p->next;
}
if(n==num)
{
cout<<"查找成功!!!";
cout<<"该节点的数值是:"<<p->data<<endl;
return p;
}
else
{
cout<<"查找失败!!!"<<endl;
return NULL;
}
}

8 输出链表

void printLink( Linknode *head )
{
Linknode* pNode=head;

cout<<"这个链表的数据是:"<<endl;
while(pNode)
{
cout<<pNode->data<<endl;
pNode=pNode->next;
}
}



测试代码为:

Linknode *theLink;
int numNode;
cout<<"请输入创建的链表的个数";
cin>>numNode;
theLink=createLink(numNode);
cout<<"链表的长度是:"<<lenthLink(theLink)<<endl;

//theLink=insertNode(theLink,6,2);
//theLink=deleteNode(theLink,3);
//theLink=sortLink(theLink);
//theLink=invertLink(theLink);
Linknode *p=locateN(theLink,3);

你可能感兴趣的:(链表)