单链表的建立、排序和翻转

链表:

1、注意是否有带头结点。

2、单链表的建立:顺序建表(尾插法)、逆序建表(头插法)。

3、单链表的插入、删除操作需要寻找前驱结点。

单链表的建立、排序和翻转,都是针对有头结点的单链表。

#include <iostream>
using namespace std;

typedef struct Node
{
    int data;
    Node * next;
}Node,*List;

//顺序建表:尾插法
void CreateLinkList(List& L, int n)
{
    //  建立空表
    L = (List)malloc(sizeof(Node));
    L->next = NULL;    //空表
    List p = L;    //用p指向表尾
    //  插入元素
    for(int i=0; i<n; i++ )
    {
        int x;
        cin>>x;
        List s = (List) malloc(sizeof(Node));
        s->data = x;
        //  插入表尾
        s->next = p->next;
        p->next = s;
        p = s;    //  新的表尾
    }
}

//逆序建表:头插法
void CreateLinkList2(List& L, int n)
{
    //  建立空表
    L = (List) malloc(sizeof(Node));
    L->next = NULL;  // 空表
    //  插入元素
    for (int i=0; i<n; i++ )
    {
        int x;
        cin>>x;
        List s = (List) malloc(sizeof(Node));
        s->data = x;
        //  插入表头
        s->next = L->next;
        L->next = s;
    }
}

void PrintLinkList(List L)
{
   List p = L->next;
   while( p!=NULL )
   {
       cout<<p->data<<" ";
       p = p->next;
   }
   cout<<endl;
}

int GetLength(Node *head)
{
    int len = 0;
    List p = head->next;
    while(p)
    {
        ++len;
        p = p->next;
    }
    return len;
}

void DestroyList(List & L)
{
    List p = L;
    List q = NULL;
    while(p)
    {
        q = p->next;
        free(p);
        p = q;
    }
}

//采用插入法将单链表中的元素排序。
void InsertionSort(List & L)
{
    List h=L->next;      // 原链表
    L->next=NULL;      // 新空表
    List s=NULL,p=NULL;
    while(h)
    {
        // 从原链表中取下结点s
        s=h;  h=h->next;
        // 在新表中查找插入位置
        p=L;
        while (p->next && p->next->data<=s->data)
        p=p->next;
        // 在p之后插入s
        s->next=p->next;
        p->next=s;
    }
}

//采用选择法将单链表中的元素排序。
void SelectionSort(List & L)
{
    List p=L;
    List q=NULL,s=NULL,m=NULL;
    while (p->next)
    {
        // 选择最小(从p->next至表尾)
        q=p;     // 最小元素的前驱q
        s=p;
        while(s->next)
        {
            if(s->next->data<q->next->data)  q=s;
            s=s->next;
        }
        m=q->next;     // 找到最小m
        // 最小元素m插入有序序列末尾(p之后)
        if (q!=p)
        {
            q->next=m->next;      // 解下最小m
            m->next=p->next;      // 插入p之后
            p->next=m;
        }
        p=p->next;     // L->next至p为有序序列
    }
}

//单链表就地逆置
void ReverseList(Node* h)
{
    Node* p = h->next;  // 原链表
    h->next = NULL; // 新表(空表)
    while(p != NULL)
    {
        Node* q = p->next;  // 保存下个结点q
        p->next = h->next;
        h->next = p;
        p = q;
    }
}

int main()
{
    List head = NULL;
    CreateLinkList(head,5);
    PrintLinkList(head);
    cout<<"Len: "<<GetLength(head)<<endl;

    InsertionSort(head);
    PrintLinkList(head);

    ReverseList(head);
    PrintLinkList(head);

    DestroyList(head);

    return 0;
}

 

 

posted @ 2012-08-03 22:00  阿凡卢  阅读(1277)  评论(0编辑  收藏  举报