1. 程式人生 > >連結串列問題歸納總結--C和C++

連結串列問題歸納總結--C和C++

1.單鏈表的建立、測長以及列印

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

Node *CreatList()
{
    int data;
    Node *head, *p, *s = NULL;
    head = (Node*)malloc(sizeof(Node));
    p = head;
    int cycle = 1;
    cout << "請輸入你需要的連結串列,按“0”鍵結束:" << endl;
    while (cycle)
    {
        scanf("%d
"
, &data); if (data) { s = (Node*)malloc(sizeof(Node)); s->data = data; p->next = s; p = p->next; } else break; } head = head->next; s->next = NULL; return head; } int ListLength(Node *head
) { int len = 0; Node *p = head; while (p != NULL) { p = p->next; len++; } return len; } void ListPrint(Node *head) { if (head) { Node *p = head; cout << "連結串列長度為: " << ListLength(head) << endl; cout << "連結串列為: "
; while (p != NULL) { cout << p->data << " "; p = p->next; } } }

2.單鏈表刪除結點

Node *DeleteNode(Node *head, int x)
{
    if (head == NULL)
        return NULL;
    Node *p1 = head, *p2 = NULL;
    while (p1->data != x && p1->next != NULL)
    {
        p2 = p1;
        p1 = p1->next;
    }
    if (p1->data == x)
    {
        if (p1 == head)
        {
            head = p1->next;
            free(p1);
        }
        else
        {
            p2->next = p1->next;
            free(p1);
        }
    }
    return head;
}

3.單鏈表插入節點

Node *ListInsert(Node *head, int x)
{
    Node *p1 = head, *p2 = NULL;
    Node *s = (Node*)malloc(sizeof(Node));
    s->data = x;
    while (p1->data < x && p1->next != NULL)
    {
        p2 = p1;
        p1 = p1->next;
    }
    if (p1->data >= x)
    {
        if (p1 == head)
        {
            s->next = p1;
            head = s;
        }
        else
        {
            p2->next = s;
            s->next = p1;
        }
    }
    else
    {
        p1->next = s;
        s->next = NULL;
    }
    return head;
}

4.實現單鏈表的排序

Node *ListSort(Node *head)
{
    Node *p = head;
    int len = ListLength(head);
    int tmp, flag = 0;
    for (int i = 1; i < len; i++)
    {
        p = head;
        for (int j = i; j < len; j++)
        {
            if (p->data>p->next->data)
            {
                tmp = p->data;
                p->data = p->next->data;
                p->next->data = tmp;
                flag = 1;
            }
            p = p->next;
        }
        if (!flag)  //若未發生交換,排序結束
            break;
    }
    return head;
}

5.給出一個單鏈表,不知道結點N的值,怎樣只遍歷一次就可以求出他的中間節點

Node *SearchMidNode(Node *head)
{
    Node *p1 = head, *p2 = head;
    while (p1->next != NULL)
    {
        p1 = p1->next;
        if (p1->next == NULL)
            break;
        else
        {
            p1 = p1->next;
            p2 = p2->next;
        }
    }
    return p2;
}

程式碼解析:即建立兩個指標p1、p2指向連結串列的首位置,p1每次向前遞加兩次,p2遞加一次,直到p1指向連結串列尾端,返還p2