單鏈表基本操做總結

鏈表,一種線性表,但並不會按線性的順序存儲數據。而是在每個節點裏存到下一個節點的指針(Pointer)。因爲沒必要須按順序存儲,鏈表在插入的時候能夠達到O(1)的複雜度,比另外一種線性表順序錶快得多,可是查找一個節點或者訪問特定編號的節點則須要O(n)的時間,而順序表相應的時間複雜度分別是O(logn)和O(1)。函數

單鏈表

結點類型描述指針

typedef struct LinkList{
    ElemType data;         //數據域
    struct Node *next;    //指針域
}Node, *LinkList;

初始化code

LinkList initList()
{
    LinkList L = (LinkList)malloc(sizeof(Node));
    L->next = NULL;
    return L;
}

頭插法input

LinkList List_headInsert(LinkList L)
{
    Node *s;
    int x;
    printf("input the Node number:\n");
    scanf("%d",&x);
    while(x!=9999)                        //輸入9999時結束
    {
        s = (Node*)malloc(sizeof(Node));
        s->data = x;
        s->next = L->next;
        L->next = s;
        scanf("%d",&x);
    }
    return L;
}

尾插法it

LinkList List_TailInsert(LinkList L)
{
    int x;
    Node *s;
    Node *r = L;
    printf("input the Node number:\n");
    scanf("%d",&x);
    while(x!=9999)
    {
        s = (Node*)malloc(sizeof(Node));
        s->data = x;
        r->next = s;
        r = s;                            //指向新的表尾結點
        scanf("%d",&x);
    }
    r->next = NULL;
    return L;
}

查找List

//按序號查找結點值,取出鏈表L中第i個位置結點
Node *GetElem(LinkList L,int i)
{
    int num = 1;
    Node *p = L->next;
    if(i==0)
        return L;
    if(i<1)
        return NULL;
    while(p && num<i)
    {
        p = p->next;
        num++;
    }
    return p;
}
//按值查找結點
Node *LocateElem(LinkList L,ElemType e)
{
    Node *p = L->next;
    while(p!=NULL && p-data!=e)
    {
        p = p->next;
    }
    return p;
}

插入鏈表

將值爲e的新結點插入到單鏈表的第i個位置next

LinkList NodeInsert(LinkList L,int i,ElemType e)
{
    Node *p = L;
    int num = 0;
    Node *s = (Node*)malloc(sizeof(Node));
    //這裏也能夠直接調用前面的GetElem函數
    //p = GetElem(L,i-1);
    while(p && num<i-1)
    {
        p = p->next;
        num++;
    }
    s->data = e;
    s->next = p->next;
    p->next = s;
    return L;
}

刪除數據

將某個給定的結點刪除,按照序號刪除,或者按照值刪除,下面實現按序號刪除時間

LinkList NodeDelete(LinkList L,i)
{
    Node *p;
    Node *q;
    p = GetElem(L,i-1);
    q = p->next;
    p->next = p->next->next;
    free(q);
    return L;
}

求表長

int ListLength(LinkList L)
{
    Node *p = L->next;
    int i = 0;
    while(p)
    {
        i++;
        p = p->next;
    }
    return i;
}
相關文章
相關標籤/搜索