1. 程式人生 > >單鏈表的建立(帶頭結點以及不帶頭結點)

單鏈表的建立(帶頭結點以及不帶頭結點)

不帶頭結點

#include "stdio.h"
#include "stdlib.h"
typedef struct List {
int data; //資料域
struct List *next; //指標域
} List;
List * HeadCreatList() //頭插法建立連結串列,不帶頭結點 
{
    List *s; //不用像尾插法一樣生成一個終端節點。
    List *head=NULL;
    for (int i = 0; i < 10; i++) {
    s = (struct List*) malloc(sizeof(struct List));
    s->data = i;
    s->next = head; //將L指向的地址賦值給S;//頭插法與尾插法的不同之處主要在此,
//s所指的新節點的指標域next指向L中的開始節點
    head = s; //頭指標的指標域next指向s節點,使得s成為開始節點。
    }
    return head;
}

List * TailCreatList() //尾插法建立連結串列,不帶頭結點  
{
    List *head,*r; 
    List *s;
    head=NULL;
    r=head;
    for (int i = 0; i < 10; i++) {
        s = (struct List*) malloc(sizeof(struct List));
        s->data = i;
        if(head ==NULL)
        {
            head=s;
            r=s; 
            continue;
        }
            r->next=s; //將L指向的地址賦值給S;//頭插法與尾插法的不同之處主要在此,
            //s所指的新節點的指標域next指向L中的開始節點
            r = s; //頭指標的指標域next指向s節點,使得s成為開始節點。
    }

    if( r!=NULL)
        r->next = NULL;
    return head;

void DisPlay(List *L) { //列印節點
List *p = L;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
    List *head=NULL,*head1=NULL;
    head=HeadCreatList();
    DisPlay(head);
    head1=TailCreatList();
    DisPlay(head1);    
}

帶頭結點

#include "stdio.h"
#include "stdlib.h"
typedef struct List {
int data; //資料域
struct List *next; //指標域
} List;
List * HeadCreatList() //頭插法建立連結串列,帶頭結點 
{
    List *s; //不用像尾插法一樣生成一個終端節點。
    List *head=(struct List*) malloc(sizeof(struct List));
    head->next=NULL;
    for (int i = 0; i < 10; i++) {
    s = (struct List*) malloc(sizeof(struct List));
    s->data = i;
    s->next = head->next; //將L指向的地址賦值給S;//頭插法與尾插法的不同之處主要在此,
//s所指的新節點的指標域next指向L中的開始節點
    head->next = s; //頭指標的指標域next指向s節點,使得s成為開始節點。
    }
    return head;
}

List * TailCreatList() //尾插法建立連結串列,帶頭結點  
{
    List *head,*r; 
    List *s;
    head=(struct List*) malloc(sizeof(struct List));
    head->next;
    r=head;
    for (int i = 0; i < 10; i++) {
        s = (struct List*) malloc(sizeof(struct List));
        s->data = i;
        r->next=s; //將L指向的地址賦值給S;//頭插法與尾插法的不同之處主要在此,
        //s所指的新節點的指標域next指向L中的開始節點
        r = s; //頭指標的指標域next指向s節點,使得s成為開始節點。
    }
    if( r!=NULL)
        r->next = NULL;
    return head;

void DisPlay(List *L) { //列印節點
List *p = L->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
    List *head=NULL,*head1=NULL;
    head=HeadCreatList();
    DisPlay(head);
    head1=TailCreatList();
    DisPlay(head1);    
}