链表基础

  • 基本的单链表创建与遍历
#include <iostream>
#include <stdlib.h>
using namespace std;

struct LinkNode
{
    LinkNode* next;
    int data;
};

typedef LinkNode LinkList;

LinkList* CreateList()
{
    LinkList* list = NULL;

    LinkNode* p = list;
    LinkNode* s;
    int data;
    while (true)
    {
        cin >> data;
        if (data == 0)
            break;

        s = (LinkList*)malloc(sizeof(LinkList));        
        s->data = data;
        s->next = NULL;

        if (list == NULL)
        {
            list = s;
            p = s;
        }else{
            p->next = s;
        }
        p = s;
    }
    cout << "Created List" << endl;
    return list;
}

void LoopList(LinkList* list)
{
    if (list == NULL)
    {
        cout << "Empty list" << endl;
        return;
    }

    LinkNode* p = list;
    while (p != NULL)
    {
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
}

int main() {
    LinkList* list = CreateList();
    LoopList(list);

    system("pause");
    return 0;
}
  • 单链表创建时排序
#include <iostream>
#include <stdlib.h>
using namespace std;

struct LinkNode
{
    LinkNode* next;
    int data;
};

typedef LinkNode LinkList;

LinkList* CreateSortedList()
{
    LinkList* list = NULL;

    LinkNode* p;
    LinkNode* prev_p;
    LinkNode* s;
    int data;
    while (true)
    {
        cin >> data;
        if (data == 0)
            break;

        s = (LinkList*)malloc(sizeof(LinkList));
        s->data = data;
        s->next = NULL;

        if (list == NULL)
        {
            list = s;
        }
        else{
            p = list;
            prev_p = NULL;//由于单链表无法直接定位到上一个结点,所以保存上一个结点的临时指针
            while (p != NULL)
            {
                if (p->data > s->data)
                {
                    if (prev_p == NULL)//需要插入到第一个结点之前的情况,需要移动头指针list的位置
                    {
                        s->next = p;
                        list = s;
                    }
                    else
                    {
                        s->next = p;
                        prev_p->next = s;
                    }
                    break;
                }
                else if (p->next = NULL)//已到链表尾部的情况
                {
                    p->next = s;
                    break;
                }
                else{//当前不符合插入条件,继续往下一个结点移动
                    prev_p = p;
                    p = p->next;
                }
            }
        }
    }
    cout << "Created Sorted List" << endl;
    return list;
}

void LoopList(LinkList* list)
{
    if (list == NULL)
    {
        cout << "Empty list" << endl;
        return;
    }

    LinkNode* p = list;
    while (p != NULL)
    {
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
}

int main() {
    LinkList* list = CreateSortedList();
    LoopList(list);    

    system("pause");
    return 0;
}
  •  单链表倒置
#include <iostream>
#include <stdlib.h>
using namespace std;

struct LinkNode
{
    LinkNode* next;
    int data;
};

typedef LinkNode LinkList;

LinkList* CreateList()
{
    LinkList* list = NULL;

    LinkNode* p = list;
    LinkNode* s;
    int data;
    while (true)
    {
        cin >> data;
        if (data == 0)
            break;

        s = (LinkList*)malloc(sizeof(LinkList));        
        s->data = data;
        s->next = NULL;

        if (list == NULL)
        {
            list = s;
            p = s;
        }else{
            p->next = s;
        }
        p = s;
    }
    cout << "Created List" << endl;
    return list;
}

void LoopList(LinkList* list)
{
    if (list == NULL)
    {
        cout << "Empty list" << endl;
        return;
    }

    LinkNode* p = list;
    while (p != NULL)
    {
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
}

LinkList* Reverse(LinkList* list)
{
    if (list == NULL)
    {
        cout << "Empty list" << endl;
        return NULL;
    }

    LinkNode* p = list;
    LinkNode* rear = NULL;
    LinkNode* temp;
    while (p != NULL)
    {
        temp = p;
        p = p->next;
        temp->next = rear;
        rear = temp;
    }
    return rear;
}

int main() {
    LinkList* list = CreateList();
    LinkList* revList = Reverse(list);
    LoopList(revList);

    system("pause");
    return 0;
}

 

posted @ 2016-11-16 10:44  AngelXiao  阅读(132)  评论(0编辑  收藏  举报