C鏈表

//C鏈表基本一系列操作,該鏈表不帶頭結點,沒有頭指針
#include <stdlib.h>
#include <stdio.h>
typedef int ElemType;
typedef struct List *link;
typedef struct List Lnode;

/*
* 結點結構 
*/
struct List
{
    ElemType data;
    struct List *next;
};

/*
* 創造一個鏈表
* @param link Head 鏈表的首指針
* @return link Head 創建鏈表之後鏈表的首指針
*/
link create(link Head)
{
    ElemType newData;
    link NewPoint;
    Head = (link)malloc(sizeof(Lnode));//申請空間
    printf("please input number: \n");
    scanf("%d", &newData);
    Head->data = newData;
    Head->next = NULL;

    while (1)//循環讀入,直至結點數據域爲-1
    {
        NewPoint = (link)malloc(sizeof(Lnode));
        if (NewPoint == NULL)
        {
            break;
        }
        printf("please input number : input '-1' means exit\n");
        scanf("%d", &newData);
        if (newData == -1) return Head;
        NewPoint->data = newData;
        NewPoint->next = Head;
        //更新首結點
        Head = NewPoint;
    }
    return Head;
}


/*
* 遍歷鏈表
* @parma link Head 鏈表的首指針
* @return void
*/
void display(link Head)
{
    link p;
    p = Head;
    if (p == NULL)
    {
        printf("\nList is empty\n");
    }
    else
    {
        do
        {
            printf("%d\n", p->data);
            p = p->next;
        } while (p != NULL);
        
    }
    
}

/*
* 在鏈表第i個位置插入結點
* @parma link Head 鏈表首指針
* @parma ElemType x 新結點數據域
* @parma int i 第i個結點位置
* @return link 更新新鏈表首指針
*/
link insert(link Head, ElemType x, int i)
{
    link NewPoint, p = Head;
    int j = 1;
    NewPoint = (link)malloc(sizeof(Lnode));
    NewPoint->data = x;
    if (i == 1)
    {
        NewPoint->next = Head;
        Head = NewPoint;
    }
    else
    {
        //找到前一個結點
        while (j < i - 1 && p->next != NULL)
        {
            p = p->next;
            j++;
        }
        if (j == i - 1)
        {
            //添加結點
            NewPoint->next = p->next;
            p->next = NewPoint;
        }
        else
        {
            printf("insert is Failure, i is not right\n");
        }
        return Head;
    }
}

/*
* 刪除第i個結點
* @prama link Head 鏈表首指針
* @prama int i 刪除位置
* @return link Head 更新後鏈表首指針
*/
link del(link Head, int i)
{
    int j = 1;
    link p, t;
    p = Head;
    if (i == 1)
    {
        p = p->next;
        free(Head);
        Head = p;
    }
    else
    {
        //找到刪除結點前一個結點
        while (j < i - 1 && p->next != NULL)
        {
            p = p->next;
            j++;
        }
        if (p->next != NULL && j == i - 1)
        {
            t = p->next;
            p->next = t->next;//刪除結點前一個結點的後繼是刪除結點的後繼
        }
        if (t != NULL)
        {
            free(t);//釋放刪除結點
        }
    }
    return Head;
}

/*
* 獲得第i個結點元素值,找到返回相應元素值,否則返回-1
* @prama link Head 鏈表首指針
* @prama int i 結點位置
* @return ElemType 返回元素值
*/
ElemType get(link Head, int i)
{
    int j = 1;
    link p;
    p = Head;
    while (j < i && p != NULL)
    {
        j++;
        p = p->next;
    }
    if (p != NULL)
    {
        return p->data;
    }
    else
    {
        printf("data is error!\n");
        return -1;
    }
}

/*
* 返回鏈表長度
* @prama link Head 鏈表首指針
* @return int len 鏈表長度
*/
int length(link Head)
{
    int len = 0;
    link p = Head;
    while (p != NULL)
    {
        len++;
        p = p->next;
    }
    return len;
}

/*
* 連接兩個鏈表
* @prama link Head1 鏈表1
* @prama link Head2 鏈表2
* @return link Head1 返回新鏈表
*/
link connect(link Head1, link Head2)
{
    link p = Head1;
    while (p->next != NULL)
    {
        p = p->next;
    }
    p->next = Head2;
    return Head1;
}

/*
* 釋放鏈表
* @prama link Head 鏈表
* @return link Head 空鏈表
*/
link setnull(link Head)
{
    link p = Head;
    while (p != NULL)
    {
        p = p->next;
        free(Head);
        Head = p;
    }
    return Head;
}

/*
* 查找結點元素x的位置,找到返回相應位置,否則返回-1
* @prama link Head 鏈表首指針
* @prama ElemType x 待查找元素
* @return int n 元素位置
*/
int locate(link Head, ElemType x)
{
    int n = 0;
    link p = Head;
    while (p != NULL && p->data != x)
    {
        p = p->next;
    }
    if (p == NULL)
    {
        return -1;
    }
    else
    {
        return n+1;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章