单链表的创建(头插法和尾插法)

巧了我就是萌 提交于 2021-01-15 13:12:55

单链表的创建分为头插法和尾插法,头插法是不断地向头结点插入新的结点。这样会使你所插入的结点值呈现逆序,所以头插法也可以实现单链表的逆置。尾插法是不断地向插入的新元素之后再插入新的元素。需要注意的是头插法必须初始化头结点,使得头结点的指针域指向NULL,即p->next=NULL,详细请看代码:

#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;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!