单链表的链式表示和实现(含代码)

代码

#include<stdio.h>
#include<iostream>

using namespace std;



typedef struct LNode{
    int   data;                                      //结点的数据域
    struct LNode *next;                              //结点的指针域
}LNode, *LinkList;                                   //LinkList为指向结构体LNode的指针类型


LinkList createList_first(LinkList &L,int n);
LinkList createList_last(LinkList &L, int n);
void print(LinkList &head);
bool isEmpty(LinkList L);
void print(LinkList &head);
bool isEmpty(LinkList L);
int GetLength(LinkList &head);
bool insertList_L(LinkList &L, int position, int data);
bool deleteList_L(LinkList &L,int position);



   /*逆位为序输入n个元素的值,建立带头结点的单链表L   O(n) */
// 前插法是通过将新节点组个插入链表的头部(头结点之后)来创建链表。
// 首先建立只有头结点的空链表,
// 没读入一个数据元素则申请一个新的结点,
// 并将新节点插入到头结点之后。

LinkList createList_first(LinkList &L,int n) {

    L = new LNode;
    L->data = 2013211553;                        //头结点里面的输入我的学号 ^_^ ,方便做测试用
    L->next = NULL;                              //先建立一个带头结点的空链表

    printf(" ***********前插法创建单链表,请输入%d个数****************\n",n);

    for(int i = n; i > 0; i--) {    
        LNode* p = new LNode;                    //生成新结点
        cin>>p->data;                            //输入元素
        p->next = L->next;                       
        L->next = p;                             //插入到表头
    }
    print(L);
    return L;
}

    /*正为序输入n个元素的值,建立带头结点的单链表L  O(n)*/
// 后插法是通过将新节点逐个插入到链表的尾部来创建链表。
// 首先要建立一个只有头结点的空链表L,为了使新节点能够插入到表尾,
// 需要增加一个尾指针endNode指向链表的尾结点
// 初始时,endNode均指向头结点。每读入一个数据元素则申请一个新的结点,
// 将新节点插入到尾结点之后,然后使endNode指向新的尾结点

LinkList createList_last(LinkList &L, int n) {

    L = new LNode;
    L->data = 2013211553;
    L->next = NULL;

    printf(" **********尾插法创建单链表,请输入%d个数**********\n",n);

    LNode* endNode = L;
    for(int i = 0; i < n; i++) {

        LNode* p = new LNode;
        cin>>p->data;
        p->next = NULL;
        endNode->next = p;                        //插入到表尾
        endNode = p;                              //endNode指向新的尾结点
    }
    print(L);
    return L;

}

/*该函数用于遍历输出链表所有元素(包括头链表的结点信息)*/
void print(LinkList &head) {

    if(head == NULL)
        return;
    LNode* node = head->next;
    printf(" **********遍历输出链表所有元素**********\n");
    printf(" 头结点里面的数据信息: %d\n",head->data);
    printf("链表中的实际元素(除头结点外)为");
    for(int i = 1; node != NULL; i++) {         
        printf(" %d ",node->data);
        node = node->next;
    }

}



bool isEmpty(LinkList L) {

    if(L->next == NULL)
        return false;
    else 
        return true;

}

   /*在带头结点的单链表L中查找的第i*/
bool GetElem_L(LinkList L,int i) {
    printf(" **********在带头结点的单链表查找元素**********\n");
    bool flag = false;
        LNode* p = L->next;                  //初始化,node 指向第一个结点,
        int j = 1;                             //初始化, j为计数器

        while(p && j < i) {                 //顺链域向后扫描,直到node指向第i个元素或p为空

            p = p->next;
            j++;
        }
        if(!p ||j>i){                      //第i个元素不在
            printf("没有第%d个位置的元素\n",i);

        } else {
            printf(" 第%d个位置的元素是 %d\n",i,p->data);
        }



    return flag;
}


int GetLength(LinkList &head) {
    int length = 0;

    LNode* node = head->next;
    for(length ; node != NULL;length++) {
    node = node->next;
    }
    return length;
}

    /* 在带头结点的单链表L中第posion个位置之前插入元素data*/
//  (1) 找到结点A(position-1)并由指针p指向该节点
//  (2) 生成一个新的结点*node
//  (3) 将新结点点*node的数据设置为data
//  (4) 将新节点*node的指针指向结点A(position)
//  (5) 令结点A(position-1)的指针域指向新的结点*node

bool insertList_L(LinkList &L, int position, int data){

    bool flag = false;
    LNode* p = L;
    int j = 0;
    while(p&&j<position-1){              //寻找第position-1个结点
        p = p->next;
            j++;
    }
    if(!p||j>position-1)                 //i大于表长+1或者小于1
        flag = false;

    LNode* node = new LNode;             //新生结点
    node->data = data;                   //将结点node的数据域设置为data
    node->next = p->next;                //将结点node插入表L中
    p->next = node;
    flag = true;
    print(L);
    return flag;
}

    /*在带头结点的单链表L中,删除第position个元素*/
//  找到结点 A(position-1)并由指针p指向该结点 
//  临时保存待删除结点A(position)的地址在node, 以便释放
//  令p->next指向A(position)的直接后继结点
//  释放结点A(position)的空间

bool deleteList_L(LinkList &L,int position) {

    bool flag = false;
    LNode* p = L;
    int j = 0;
    while((p->next)&&j<position-1) {                      //寻找第i-1个节点

        p = p->next;
        j++;
    }
    if(!(p->next)||j>position-1)                          //i大于表长 + 1 或者小于1
        flag = false;

    LNode* node = p->next;                               //临时保存被删除结点的地址以便释放
    printf("\n\t删除的元素是  %d\n",node->data);
    p->next = node->next;                                //释放删除的结点空间                            
    delete(node);
    print(L);

    return flag;
}

void main() {

    LNode* head = new LNode;

    //创建链表
    int length = 0;
    printf("\t\t请输入链表的长度:");
    scanf("%d",&length);
    getchar();
    LinkList L = createList_last(head,length);


    //插入元素
    int position = 0, data = 0;
    printf("\n\n\t\t请输入插入元素的位置和值:");
    scanf("%d,%d",&position,&data);
    getchar();
    insertList_L(L,position,data);


    //查找元素
    int getelem = 0;
    printf("\n\n\t\t请输入要查找的元素位置");
    scanf("%d",&getelem);
    getchar();
    GetElem_L(L,getelem);


    //删除元素
    int deletep = 0;
    printf("\n\n\t\t请输入要删除的元素位置");
    scanf("%d",&deletep);
    getchar();
    deleteList_L(L,deletep);

    //求链表的长度
    int getlength = 0;
    getlength = GetLength(L);
    printf("\n\n\t\t链表的长度(除头结点)为:%d\n",getlength);



}

运行结果截图

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值