C語言實現鏈表基本操作

C語言實現鏈表基本操作


之前說過順序表的基本操作。顯然,順序表有一個很大的缺點,就是做插入刪除操作的時候,往往要做很大量的元素移動的操作。這裏我們討論另外一種線性表的表示方法——鏈式存儲結構。由於它不需要邏輯上的相鄰的元素在物理位置上也相鄰,因此它沒有順序存儲結構所具有的弱點,但是同時也失去了順序表的可隨機存取的有點。


  • 結構
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;      //數據元素的類型,假設是int型的

typedef struct LNode{
    ElemType    data;   //數據域
    struct LNode *next; //下一個節點的指針
}LNode, *LinkList;
  • 創建鏈表
//創建鏈表
void createList(LinkList &L,int n)
{
    L = (LinkList)malloc(sizeof(ElemType));
    L->next = NULL; //創建頭節點

    LinkList p,q;
    q = L;
    for(int i=0;i<n;i++)
    {
        p = (LinkList)malloc(sizeof(LNode)); //一個新的節點
        printf("請輸入值");
        scanf("%d",&p->data);
        p->next = NULL;
        q->next = p;
        q = q->next;
    }
}
  • 遍歷輸出鏈表
//遍歷輸出鏈表
void toString(LinkList L)
{
    LinkList p;
    p = L->next;
    printf("Head->");
    while(p)
    {
        printf("%d->",p->data);
        p = p->next;
    }
    printf("NULL\n");
}
  • 插入一個元素
int LinkListInsert(LinkList L,int i,ElemType e)
{
    LinkList p = L;
    int j=0;
    while(p && j<i-1)
    {
        p = p->next;
        j++;
    }

    if(!p||j>i-1)
    {
        printf("給出的位置錯誤");
        return -1;
    }

    LinkList s = (LinkList)malloc(sizeof(LNode));
    s->data = e;
    s->next = p->next;
    p->next = s;
    return 1;
}
  • 刪除一個元素
//刪除一個元素
int LinkListDelete(LinkList L,int i,ElemType &e)
{
    LinkList p = L;
    int j=0;
    while(p && j<i-1)
    {
        p = p->next;
        j++;
    }

    if(!p||!(p->next)||j>i-1)
    {
        printf("給出的位置錯誤");
        return -1;
    }

    LinkList s = p->next;

    p->next = s->next;

    return 1;
}
  • 主函數
int main()
{
    int n ;
    LinkList L;
    printf("請輸入n\n");
    scanf("%d",&n);
    createList(L,n);
    toString(L);
    LinkListInsert(L,5,9);
    toString(L);
    int e;
    LinkListDelete(L,6,e);
    toString(L);
}
  • 測試結果

測試結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章