程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 鏈表的操作2

鏈表的操作2

編輯:關於C語言

1 求出鏈表的倒數第K個元素


2 已知兩個鏈表head1 和head2 各自有序,請把它們合並成一個鏈表依然有序

(保留所有結點,即便大小相同)

在這裡使用 兩種方法:遞歸和非遞歸的方法。


typedef struct node
{
int data;
//Linknode *next; 錯誤的!!!
struct node *next;
}Linknode;
Linknode *createLink(int n);

======================================================================================

1 求出鏈表的倒數第K個元素

代碼實現:

//定義 node1和node2結點進行比較相差k-1),當node2到最後的一個結點時,node1即為所求的。
bool findLastKnode( Linknode *head,int numK)
{
assert(head!=NULL);
Linknode *node1,*node2;
node1=head;
node2=head;
int num=1;

//1 找到node2的位置
while(node2!=NULL&&num<numK)
{
num++;
node2=node2->next;
}

//todo:這個判斷條件是否需要改進???
if(num==numK&&node2!=NULL) //查找成功
{
//while(node2!=NULL)
while(node2->next!=NULL)
{
node1=node1->next;
node2=node2->next;
}
cout<<"找到的結點是:"<<node1->data<<endl;
return true;
}
cout<<"I'm sorry,can not find it."<<endl;
return false; //查找失敗
}


測試代碼:

int num;
cout<<"請輸入要創建的節點的個數n:";
cin>>num;
Linknode *link;
link=createLink(num);
bool isFind=findLastKnode(link,2);

return 0;


2 已知兩個鏈表head1 和head2 各自有序,請把它們合並成一個鏈表依然有序

(保留所有結點,即便大小相同)


注意:下面寫的代碼裡已經假設head1和head2已經排好序了。

2.1 非遞歸的方法


Linknode * MergeLink( Linknode *head1,Linknode *head2 )
{
    if(head1==NULL)
        return head2;
    if(head2==NULL)
        return head1;
    Linknode *head,*curnode;   //創建的鏈表的頭結點和標識的結點。
    Linknode *link1,*link2;
    link1=head1;
    link2=head2;
    //1 確定頭結點
    if(link1->data<=link2->data)
    {
        head=link1;
        link1=link1->next;
    }
    else
    {
        head=link2;
        link1=link2->next;
    }
    cout<<"第一個元素是"<<head->data<<endl;
    //2 循環構建剩下的結點:2.1兩個鏈表都含有節點的時候   2.2 只含有一個節點了。
    curnode=head;
    while(link1!=NULL&&link2!=NULL)
    {
        if(link1->data<=link2->data)
        {
            curnode->next=link1;
            link1=link1->next;
        }
        else
        {
            curnode->next=link2;
            link2=link2->next;
        }
        curnode=curnode->next;         //當前結點往後面移動
    }
    //只含有一個節點的情況
    if(link1!=NULL)
    {
        curnode->next=link1;
    }
    if(link2!=NULL)
    {
        curnode->next=link2;
    }
                                              
    printLink(head);
    return head;
}


2 遞歸的方法


Linknode * MergeRecursion( Linknode *head1,Linknode *head2 )
{
    //1 最後的退出條件   2 遞歸:縮小范圍或者規模
    if(head1==NULL)
        return head2;
    if(head2==NULL)
        return head1;
    Linknode *head;     //創建的鏈表的頭結點和標識的結點。
    if(head1->data<=head2->data)
    {
        head=head1;
        head->next=MergeRecursion(head1->next,head2);
    }
    else
    {
        head=head2;
        head->next=MergeRecursion(head1,head2->next);
    }
                           
    printLink(head);
    return head;
}


3 代碼測試

int main()
{
    int num1,num2;
    cout<<"請輸入第一個和第二個鏈表的個數:";
    cin>>num1>>num2;
    Linknode *link1,*link2,*link;
    link1=createLink(num1);
    link2=createLink(num2);
    //link=MergeLink(link1,link2);
    link=MergeRecursion(link1,link2);
    return 0;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved