單鏈表的建立(頭插法和尾插法)

單鏈表的建立分爲頭插法和尾插法,頭插法是不斷地向頭結點插入新的結點。這樣會使你所插入的結點值呈現逆序,因此頭插法也能夠實現單鏈表的逆置。尾插法是不斷地向插入的新元素以後再插入新的元素。須要注意的是頭插法必須初始化頭結點,使得頭結點的指針域指向NULL,即p->next=NULL,詳細請看代碼:ios

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

//單鏈表定義(結構體)
typedef struct LNode{
    int data;//數據域
    struct LNode *next;//指針域 
}LNode,*LinkList; 

//初始化單鏈表(不帶頭結點) 
/*
bool InitList(LinkList &L){
    L = NULL;//將單鏈表初始化爲空表 
    return true;
}
*/

//初始化單鏈表(帶頭結點)
bool InitList(LinkList &L){
    L = (LNode *)malloc(sizeof(LNode));//分配一個頭結點,而且用L指針變量指向這個頭結點
    if(L==NULL){
        return false;//內存不足分配失敗 
    } 
    L->next = NULL;//頭結點以後暫時尚未結點 
    return true;
}

//尾插法創建單鏈表
LinkList List_TailInsert(LinkList &L){
    int x;
    LNode *s,*r = L;//聲明新結點和尾指針 
    scanf("%d",&x);
    while(x!=9999){
        s = (LNode *)malloc(sizeof(LNode));
        s->data = x;
        r->next = s;//將r結點與s結點鏈接 
        r = s;//尾指針指向s 
        scanf("%d",&x);
    }
    r->next = NULL;
    return L;
} 

//頭插法創建單鏈表
LinkList List_HeadInsert(LinkList &L){
    int x;
    LNode *s;
    scanf("%d",&x);
    while(x!=9999){
        s = (LNode *)malloc(sizeof(LNode));
        s->data = x;//與後插操做相似,與後插不一樣的是每次在頭結點插入 
        s->next = L->next;
        L->next = s;
        scanf("%d",&x);
    }
    return L;
}
/*
LNode *p = (LNode*)malloc(sizeof(LNode));//爲結點申請內存空間,而且用指針p指向起始地址
*/
//查找第i個結點(帶頭節點p指向第一個節點,不是頭結點) 
/*
LNode * GetElem(LinkList L,int i){
    int j = 1;
    LNode *p = L->next; 
    if(i==0){
        return L;
    }
    if(i<1){
        return NULL;
    }
    while(p!=NULL&&j<i){
        p = p->next;
        j++;
    }
    return p;
} 
*/

//按位查找(帶頭節點)
LNode *GetElem(LinkList L,int i){
    if(i<1){
        return NULL;
    }
    LNode *p = (LNode *)malloc(sizeof(LNode));
    int j=0;
    p = L;
    while(p!=NULL&&j<i){
        p = p->next;
        j++;
    }
    return p;
} 

//按值查找(帶頭節點)
LNode *LocateElem(LinkList L,int e){
    LNode *p = (LNode *)malloc(sizeof(LNode));
    p = L->next;//使指針p指向第一個結點 
    while(p!=NULL && p->data!=e){
        p = p->next;
    }
    return p;//找到返回結點指針,不然返回NULL 
}

//求單鏈表的長度
int length(LinkList L){
    int len = 0;
//  LNode *p = (LNode *)malloc(sizeof(LNode));
    LNode *p = L;
    while(p->next!=NULL){
        p = p->next;
        len++;
    }
    return len;
} 

//按位序插入單鏈表(帶頭節點)
bool ListInsert(LinkList &L,int i,int e){
    if(i<1){
        return false;
    }
    //GetElem(L,i-1);
    LNode *p;//指向當前表結點的指針
    int j = 0;//當前p指向的是第幾個結點
    p = L;//L指向頭結點,p也指向頭結點.頭結點不存任何數據 
    if(p!=NULL&&j<i-1){
        p = p->next;
        j++;
    } 
    if(p==NULL){//i值不合法(可能超出單鏈表的長度) 
        return false;
    }
    LNode *s = (LNode*)malloc(sizeof(LNode));
    s->data = e;//將結點的值存入s結點中 
    s->next = p->next;//將s結點鏈接到p的下一個結點上 
    p->next = s;//將p結點鏈接到s結點上 (上下兩句位置不可換)
    //return InsertNextNode(p,e);
}

//指定結點後插操做
bool InsertNextNode(LNode *p,int e){
    if(p==NULL){//當前p指針指向的結點正常指向下一個結點 
        return false;
    }
    LNode *s = (LNode *)malloc(sizeof(LNode));
    if(s==NULL){//內存不足 
        return false;
    }
    s->data = e;//存放數據 
    s->next = p->next; 
    p->next = s;//將s鏈接 
    return true;
} 

//指定結點前插操做
bool InsertPriorNode(LNode *p,int e){
    if(p==NULL){
        return false;
    }
    LNode *s = (LNode *)malloc(sizeof(LNode));
    if(s==NULL){
        return false;
    }
    s->next = p->next;//鏈接結點 
    p->next = s;
    s->data = p->data;//交換數據 
    p->data = e;
}

//按位序刪除單鏈表(帶頭節點)
bool ListInsert(LinkList &L,int i,int &e){
    if(i<1){
        return false;
    }
    //GetElem(L,i-1);
    LNode *p;//指向當前表結點的指針
    int j = 0;//當前p指向的是第幾個結點
    p = L;//L指向頭結點,p也指向頭結點.頭結點不存任何數據 
    if(p!=NULL&&j<i-1){
        p = p->next;
        j++;
    } 
    if(p==NULL){//i值不合法(可能超出單鏈表的長度) 
        return false;
    }
    if(p->next==NULL){//i-1結點後無結點
        return false;
    }
    LNode *q = p->next;//q指向將要刪除的結點 
    e = q->data;//用e返回刪除的元素值 
    p->next = q->next;//把p與刪除後的下一個結點鏈接 
    free(q);//釋放q結點的內存空間 
    return true;
}

//輸出函數
void p(LinkList L){
    LNode *g;
    g = L->next;
    while(g!=NULL){
        printf("%d\t",g->data);
        g = g->next;
    }
} 

int main(int argc, char** argv) {
    LinkList L;//聲明單鏈表 
    InitList(L);//初始化單鏈表
    List_TailInsert(L);//尾插法
    p(L);
    printf("\n");
    List_HeadInsert(L);//頭插法 

//  int l = length(L);
//  printf("%d\n",l);
//  for(int i=1;i<=l;i++){
//      LNode *g = GetElem(L,i);
//      printf("%d\t",g->data);
//  }
    p(L);
    return 0;
}
相關文章
相關標籤/搜索