C語言——單鏈表初始化、求表長、讀表元素、插入元素


頭文件Linear.h

// 單鏈表的類型定義
typedef struct node
{
    int data; // 數據域
    struct node *next; // 指針域
}Node, *LinkList;

 

因為單鏈表頭結點和插入的結點要動態生成,所以要引入系統頭文件<stdlib.h>或者<malloc.h>,不然會報錯。

 

1. 初始化單鏈表

LinkList InitiateLinkList()
{
    LinkList head; // 頭指針
    head = malloc(sizeof(Node)); // 動態創建頭結點
    head->next = NULL;
    return head;
}

 

2.  求單鏈表的長度:出了頭結點的所有結點的個數,包括首結點

int LengthLinkList(LinkList head)
{
    int cnt = 0;
    Node *p = head;
    while(p->next != NULL)
    {
        p = p->next;
        cnt++;
    }
    return cnt;
}

 

3.讀表元素

 在單鏈表head中查找第i個元素結點。若找到,返回指向該節點的指針,否則返回NULL

Node * GetLinkList(LinkList head, int i)
{
    int c = 1;
    Node *p;
    p = head -> next; // 初始化時,p指向首結點
    
    
    while((c < i) && (p != NULL))
    {
        p = p->next;
        c++;
    }
    if(c == i) return p;
    else return NULL;/**/

}

 

4. 插入元素

在表head的第i個數據元素結點之前插入一個以x為值的新結點

void InsertLinkList(LinkList head, int x, int i)
{
    Node *p, *q;
    if(i == 1) q = head;
    else q = GetLinkList(head, i - 1); // 找到第i - 1個數據元素結點,方便在其后插入

    if(q == NULL) printf("找不到插入位置。\n");
    else
    {
        p = malloc(sizeof(Node));
        p->data = x;
        p->next = q->next;
        q->next = p;
    }
}

 

5. 單鏈表刪除
刪除表head的第i個結點

void DeleteLinkList(LinkList head, int i)
{
    // 先找到待刪結點的直接前驅
    Node *q, *p;
    if(i == 1) q = head;
    else q = GetLinkList(head, i - 1);

    // 若前驅結點存在且待刪結點存在
    if(q != NULL && q->next != NULL)
    {
        p = q->next;
        q->next = p->next;
        free(p); // 釋放已移出結點p的空間
    }
    else
    {
        printf("找不到待刪結點\n");
    }
}

 

6.遍歷單鏈表

void traverseList(LinkList head)
{
    Node *p;
    p = head->next;
    while(p != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

 

7. 定位
求表head中第一個值等於x的結點的序號,若不存在這種結點,返回結果為0

int LocateLinkList(LinkList head, int x)
{
    int i = 0;
    Node * p = head; // p是工作指針
    p = p->next; // 初始時p指向首結點    
    while(p != NULL && p->data != x)
    {
        i++;
        p = p->next;
    }
    if(p != NULL) return i + 1;
    else return 0;
}

 

全部代碼:

#include <stdio.h>
#include <stdlib.h>
#include "Linear.h"

// 單鏈表
// p 是工作指針

// 1. 初始化
LinkList InitiateLinkList()
{
    LinkList head; // 頭指針
    head = malloc(sizeof(Node)); // 動態創建頭結點
    head->next = NULL;
    return head;
}

// 2. 求表長
int LengthLinkList(LinkList head)
{
    int cnt = 0;
    Node *p = head;
    while(p->next != NULL)
    {
        p = p->next;
        cnt++;
    }
    return cnt;
}

// 3. 讀表元素
// 在單鏈表head中查找第i個元素結點。若找到,返回指向該節點的指針,否則返回NULL
Node * GetLinkList(LinkList head, int i)
{
    int c = 1;
    Node *p;
    p = head -> next; // 初始化時,p指向首結點
    
    
    while((c < i) && (p != NULL))
    {
        p = p->next;
        c++;
    }
    if(c == i) return p;
    else return NULL;/**/

}

// 4. 插入元素
// 在表head的第i個數據元素結點之前插入一個以x為值的新結點
void InsertLinkList(LinkList head, int x, int i)
{
    Node *p, *q;
    if(i == 1) q = head;
    else q = GetLinkList(head, i - 1); // 找到第i - 1個數據元素結點,方便在其后插入

    if(q == NULL) printf("找不到插入位置。\n");
    else
    {
        p = malloc(sizeof(Node));
        p->data = x;
        p->next = q->next;
        q->next = p;
    }
}

// 5. 單鏈表刪除
// 刪除表head的第i個結點
void DeleteLinkList(LinkList head, int i)
{
    // 先找到待刪結點的直接前驅
    Node *q, *p;
    if(i == 1) q = head;
    else q = GetLinkList(head, i - 1);

    // 若前驅結點存在且待刪結點存在
    if(q != NULL && q->next != NULL)
    {
        p = q->next;
        q->next = p->next;
        free(p); // 釋放已移出結點p的空間
    }
    else
    {
        printf("找不到待刪結點\n");
    }
}


// 6.遍歷單鏈表
void traverseList(LinkList head)
{
    Node *p;
    p = head->next;
    while(p != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

// 7. 定位
// 求表head中第一個值等於x的結點的序號,若不存在這種結點,返回結果為0
int LocateLinkList(LinkList head, int x)
{
    int i = 0;
    Node * p = head; // p是工作指針
    p = p->next; // 初始時p指向首結點    
    while(p != NULL && p->data != x)
    {
        i++;
        p = p->next;
    }
    if(p != NULL) return i + 1;
    else return 0;
}


main()
{
    // 初始化變量
    LinkList head;
    int cnt;

    head = InitiateLinkList();
    printf("初始化成功!\n");

    cnt = LengthLinkList(head);
    printf("單鏈表的長度:%d\n", cnt);
    
    // 單鏈表插入結點
    InsertLinkList(head, 1, 1);
    InsertLinkList(head, 88, 2);
    InsertLinkList(head, 4, 3);
    InsertLinkList(head, 7, 4);
    InsertLinkList(head, 13, 5);
    InsertLinkList(head, 6, 6);
    InsertLinkList(head, 2, 7);

    cnt = LengthLinkList(head);
    printf("單鏈表的長度:%d\n", cnt);

    // 遍歷單鏈表
    traverseList(head);

    // 刪除結點
    DeleteLinkList(head, 6);

    traverseList(head);

    printf("結點的值為88的序號為:%d\n", LocateLinkList(head, 88));

}

 

一般的單鏈表結束。特殊的沒寫。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM