链表的使用

来源:互联网 发布:stc15w4k32s4数据手册 编辑:程序博客网 时间:2024/05/16 05:59
//带头结点的单链表,学习之用
#include <iostream>
#include 
<string>
using namespace std;

struct Node
{
    
string name;
    
int age;
    Node
* next;
}
;

typedef Node
* LinkList;

LinkList initList()
//建立头结点
{
    LinkList h
=new Node;
    h
->next=NULL;
    
return h;
}


LinkList createListQueue(
int n)//建立队列链表
{
    LinkList h,q,p;
    
    h
=initList();
    q
=h;

    
for(int i=0;i<n;i++)
    
{
        p
=new Node;
        cin 
>> p->name >> p->age;
        q
->next=p;
        q
=p;
    }

    q
->next=NULL;

    
return h;
}


void prtList(LinkList h)//输出链表
{
    LinkList p;
    p
=h->next;

    
while(p!=NULL)
    
{
        cout 
<< p->name << " " << p->age << endl;
        p
=p->next;
    }

}


LinkList createListStack(
int n)//建立栈链表
{
    LinkList h,p,q;
    h
=initList();
    q
=h->next;

    
for(int i=0;i<n;i++)
    
{
        p
=new Node;
        cin 
>> p->name >> p->age;
        h
->next =p;
        p
->next =q;
        q
=p;
    }


    
return h;
}


bool emptyList(LinkList h)//判断链表空
{
    
return h==h->next;
}


LinkList searchIndex(LinkList h, 
int i)//查找第i个结点
{
    
int k=1;
    LinkList p;
    
    p
=h->next;
    
while( k != i && p != NULL)
    
{
        p
=p->next;
        k
++;
    }


    
if (k==i) 
        
return p;
    
else
        
return NULL;
}


void insertList(LinkList h, Node t, int i)//在第i个位置插入结点t
{
    LinkList p,q,s;

    
if (i==1 || emptyList(h)==true
    
{
        p
=h;
    }

    
else
    
{
        p
=searchIndex(h, i-1);
        
if (p==NULL) return;
    }

    
    s
=new Node;
    
*s=t;
    
    q
=p->next;
    s
->next=q;
    p
->next=s;
}


void deleteList(LinkList h, int n, int i)//删除第i个结点,n为结点总数
{
    LinkList p,q;

    
if (i<1 || i>|| emptyList(h)==true)    return;

    
if (i==1)
    
{
        p
=h;
    }

    
else
    
{
        p
=searchIndex(h,i-1);
    }


    q
=p->next;
    p
->next=q->next;

    
if (q!=NULL) delete q;        
}


void reverseList(LinkList h)//逆置链表
{
    
if (emptyList(h)==truereturn;

    LinkList p
=h->next, q=p->next;
    p
->next=NULL;


    
while(q != NULL)
    
{
        p
=q->next;
        q
->next=h->next;
        h
->next=q;
        q
=p;
    }

}


void run()
{
    
int n;
    cin
>>n;
    
    
//假冒的链表逆置    
    LinkList h=createListStack(n);
    prtList(h);    

    
//真的链表逆置
    /*LinkList h=createListQueue(n);
    reverseList(h);
    prtList(h);
    
*/


    
//链表的第k个位置插入一个结点
    /*LinkList h=createListQueue(n);
    prtList(h);
    cout << endl;

    Node t;    
    cin>>t.name>>t.age;

    int k;
    cin>>k;
    insertList(h, t, k);
    prtList(h);
    
*/


    
//链表中删除第k个结点
    /*LinkList h=createListQueue(n);
    prtList(h);
    cout << endl;
    
    int k;
    cin>>k;
    deleteList(h, n, k);
    prtList(h);
*/

}


int main()
{
    
int total;
    cin
>>total;
    
for(int now=1; now<=total; now++) run();
    
return 0;
}

原创粉丝点击