單鏈表的操作

本文章主要對單鏈表的實現進行總結,以備複習:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct LNode{
    int data;
    struct LNode * next;
}LNode;

typedef LNode* List;

//頭插法帶頭結點創建
LNode * Createhead1(int length)
{
    int data[12] ={0,1,2,3,4,5,6,7,8,9,10,11};
    LNode * p;
    //srand(time(0));
    if(length < 1)
        return NULL;
    LNode *head  = (LNode*)malloc(sizeof(LNode));
    head->next = NULL;
    int i = 1;
    while(i<=length)
    {
        p = (LNode*)malloc(sizeof(LNode));
        //p->data = rand()%100+1;
        p->data = data[i];
        p->next = head->next;
        head->next = p;
        i++;
    }
    return head;

}

//頭插法無頭結點創建
LNode *Createhead2(int length)
{
    int data[12] ={0,1,2,3,4,5,6,7,8,9,10,11};
    LNode*p;
    //srand(time(0));
    if(length<1)
        return NULL;
    LNode *first = (LNode*)malloc(sizeof(LNode));
    first->next = NULL;
    first->data = data[1];
    int i = 2;
    while(i<=length)
    {
        p = (LNode*)malloc(sizeof(LNode));
        //p->data = rand()%100+1;
        p->data = data[i];
        p->next = first;
        first = p;
        i++;
    }
    return first;
}

//尾插法帶頭結點創建
LNode*Createrail1(int length)
{
    int data[12] ={0,1,2,3,4,5,6,7,8,9,10,11};
    LNode *p;
    //srand(time(0));
    if(length<1)
        return NULL;
    LNode *head =(LNode*)malloc(sizeof(LNode));
    head->next = NULL;
    LNode *temp = head;
    int i = 1;
    while(i<=length)
    {
        p = (LNode*)malloc(sizeof(LNode));
        //p->data = rand()%100+1;
        p->data = data[i];
        temp->next = p;
        temp = p;
        i++;
    }
    temp->next = NULL;
    return head;
}

//尾插法無頭結點創建
LNode * Createrail2(int length)
{
    int data[12] ={0,1,2,3,4,5,6,7,8,9,10,11};
    LNode *p;
    //srand(time(0));
    if(length<1)
        return NULL;
    LNode *first = (LNode*)malloc(sizeof(LNode));
    first->next = NULL;
    first->data = data[1];
    LNode * temp = first;
    int i =2;
    while(i<=length)
    {
        p = (LNode*)malloc(sizeof(LNode));
        //p->data = rand()%100+1;
        p->data = data[i];
        temp->next =p;
        temp = p;
        i++;
    }
    temp->next = NULL;
    return first;
}

int Length(List L)
{
    List p = L->next;
    int len = 0;
    while(p)
    {
        p = p->next;
        len++;
    }
    return len;
}

List  FindKth(int k,List L)
{
    List p = L->next;
    int i = 1;
    while(p && i<k)
    {
       p = p->next;
       i++;
    }
    if(i == k)
    {
        return p;
    }
    else
        return NULL;
}

List Find(int value,List L)
{
    List p = L->next;
    while(p &&p->data!=value)
    {
        p = p->next;
    }
    return p;
}

List  Insert(int value,int index,List L)
{
    int j;
    List p,s;
    if(index == 1)
    {
        s = (List)malloc(sizeof(LNode));
        s -> data = value;
        s->next = L->next;
        L -> next = s;
        return L;
    }
    p = L;
    j = 1;
    while(p->next&&j<index)
    {
        p = p->next;
        j++;
    }
    if(!p||j>index)
        return NULL;
    s = (List)malloc(sizeof(LNode));
    s->data = value;
    s->next = p->next;
    p->next = s;
    return L;
}

List Delete(int x,List L)
{
    int j;
    List p,s;
    if(x ==1)
    {
        p = L->next;
        if(p) {
            L->next = p->next;
        }
        else
            return NULL;
        free(p);
        return L;
    }
    p = L;
    j = 1;
    while(p->next && j<x)
    {
        p = p->next;
        j++;
    }
    if(!p||j>x)
        return NULL;
    s = p->next;
    p->next = s->next;
    free(s);
    return L;
}

void PrintL(List L)
{
    List p = L->next;  //注意,如果打印原始的列表,需要這個語句
    //List p = L;     //注意,如果打印從某一位置的鏈表,用這個
    if(!p)
    {
        return;
    }
    while(p)
    {
        printf("%d  ",p->data);
        p = p->next;
    }
}

int main01()
{
    List L,p,q;
    L = Createhead1(10);
    L = FindKth(3,L);
    L = Createrail1(10);
    PrintL(L);
    printf("\n");
    L = Find(8,L);
    //PrintL(L);
    return 0;
}

發佈了9 篇原創文章 · 獲贊 8 · 訪問量 2908
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章