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

来源:互联网 发布:天蝎网络第三季百度云 编辑:程序博客网 时间:2024/04/25 07:23

代码

#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)的指针域指向新的结点*nodebool 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);}

运行结果截图

这里写图片描述

0 0