单链表的各种基本运算

来源:互联网 发布:js 插件写法 面向对象 编辑:程序博客网 时间:2024/05/30 07:13

单链表的各种基本运算


  欢迎大家阅读我的博客,如果有错误请指正,有问题请提问,我会尽我全力改正错误回答问题。在此谢谢大家。下面开始正式内容

單向鍊表(單鍊表)是鍊表的一種,其特點是鍊表的連結方向是單向的,對鍊表的訪問要通過從頭部開始,依序往下讀取。维基百科-单向链表


实验环境


  • 语言c/c++
  • 编译器devc++5.11/5.40


实验内容与要求


  1. 初始化单链表;
  2. 依次插入a,b,c,d,e元素;
  3. 输出单链表L;
  4. 输出单链表L的长度;
  5. 判断单链表L是否为空;
  6. 输出单链表L的第三个元素;
  7. 输出元素a的位置;
  8. 在第4个元素位置上插入f元素;
  9. 输出单链表L;
  10. 删除L的第3个元素;
  11. 输出单链表L;
  12. 释放单链表。


目录


  • 单链表的各种基本运算
    • 实验环境
    • 实验内容与要求
  • 目录
  • 实验解析
    • 结构说明
    • 定义说明
    • 函数说明
      • 顺序表函数
        • 初始化顺序表
        • 判空
        • 获取长度
        • 打印
        • 插入
        • 添加
        • 删除
        • 倒置
        • 查询
        • 释放
      • 主函数
    • 结果展示
  • 附录
    • 相关资料
    • 源代码


实验解析

结构说明


   为了便于实现各种运算,通常在单链表的第一个结点前增设一个附加结点,称为头结点,它的结构与表结点相同,其数据域可不存储信息,也可存储表长等附加信息。单链表的结点结构除数据域外,还含有一个指针域。
  用C语言描述结点结构如下:

typedef  int  Status;typedef  char    ElemType;typedef struct  LNode{    ElemType   data;    struct  LNode  *next;}LNode, *LinkList;


定义说明


#define  OK  1#define  ERROR  0#define  TRUE  1#define  FALSE  0typedef  int  Status;typedef  char    ElemType;//这里表示链表存的是啥

  定义常用常量,类型别称


函数说明



顺序表函数

初始化顺序表

Status InitList_L (LinkList &L) {    L = (LinkList)malloc(sizeof(LNode));//分配空间    if (!L)   exit(0);//问题跳出    L->next = NULL;//用于判断链表尾    return  OK;//表示初始化成功}// InitList_L  

   给单项链表L分配空间 ,成功返回1,失败则结束程序。 使用链表一定要先初始化再使用


判空

Status EmptyList_L (LinkList L){    if(L->next==NULL) //头结点就是尾节点说明什么呢?        return OK;    return ERROR;//如果不是呢?}

  判断单项链表L是否为空,空返回1,不空为0


获取长度

int LengthList_L(LinkList L){    LinkList p=L;    int i=0;    while(p->next!=NULL){//当p节点的下一个是空了说明什么?        i++;        p=p->next;    }    return i;}

  返回链表L表长度


打印

Status DisplayList_L ( LinkList L) {    LinkList p=L->next;    while(p!=NULL){// 都是一个套路        printf("%c",p->data);//这是输出嘛        p=p->next;//又是你    }    printf("\n");//\n是啥呢?我觉得bai度一下你会记得更清楚    return OK;}

  打印链表中的值到屏幕


插入

Status ListInsert_L(LinkList &L, int i, ElemType e)  {    LinkList l1=(LinkList)malloc(sizeof(LNode)) ;//又见面了,因为链表每次只给一个节点申请空间,所以要变大变长就要满满积累喽!    LinkList  p = L;    int j;    for(j = 0; j<i-1;j++){//这个可以算是高级版的while        p = p->next;          }       if(!p||j>i-1)   //||是或的意思 与或非门学过没,不懂就度度,if要是都不知道就别说学过英语了        return ERROR;          l1->data = e;//data是存值的地方    l1->next = p->next;//变长    p->next = l1; //变长    return OK;}//ListInsert_L

  将元素e插入链表L的第i位,成功返回1,失败返回0


添加

Status ListAdd (LinkList L , ElemType e){//明明上面那个货就能做了,要你有个屁用?也就省了一步查链表长度嘛    LinkList p=L;    while(p->next){//怎么老有你        p=p->next;    }    LinkList l1  = (LinkList)malloc(sizeof(LNode));//老熟人了    l1->data = e;    l1->next = NULL;        p->next = l1;     return OK;} 

  将元素e加到链表L尾端,成功返回1,失败返回0


删除

Status ListDelete_L(LinkList &L, int i, ElemType &e) {//与插入差不多嘛    LinkList q ,p = L;      int j;    for(j = 0; j<i-1;j++)        p =p->next;    if(!p->next|| j>i-1)           return ERROR;      q= p->next;    p->next = q->next;    e =q->data;    free(q);}//ListDelete_L

   删除链表L第i个元素并保存该元素到变量e,成功返回1,失败返回0


倒置

Status ListInverted(LinkList L,LinkList IL){    LinkList p=L->next;    while(p!=NULL){ //轻车熟路,老汉推车        ElemType e = p->data;         ListInsert_L(IL, 1, e); //这是在吸取我的资源,不要模仿我,你以为倒立就不认识你了吗        p = p->next ;    }       return OK;} 

   将链表L中元素顺序倒置并保存为链表IL,成功返回1,失败返回0
   因为单链表只能从前往后找,想回个头很难,想直接倒着输出更是难上加难,不如直接生成一个倒置的,便于倒序。


查询

Status GetElemList_L (LinkList L, int i, ElemType &e) {    int j=0;    LinkList p=L;    while(j<i&&p){//有个新面孔&&这是与,或的兄弟,你懂得        ++j;        p=p->next;    }    if(!p||j>i)  //这说明什么?你在我心中根本没有位置!        return ERROR;    e=p->data;    return OK;}

  获取链表L的第i个元素,存到变量e中,成功返回1,失败返回0

Status  LocateElemList_L(LinkList L,ElemType e) {       int i=0;    LinkList p=L;    while(p!=NULL&&p->data!=e) {        ++i;        p=p->next;    }    if(p==NULL)         return 0;    else         return i;}

  获取链表L中e元素第一次出现的位置,成功返回元素位置,失败返回0


释放

Status DestroyList_L (LinkList &L)  {    LinkList p,q;    p=L;    q=p->next;    while(q!=NULL){        free(p);//这是对指针的操作,释放指针,不懂百度哦        p=q;        q=p->next;    }    free(p);    return  OK;}  

   释放传入的顺序表,成功返回1,失败返回0



主函数


int main(){    SqList L;    ElemType e;    printf("(1)初始化顺序表\n");    InitList_Sq(L);    printf("(2)依次插入a,b,c,d,e元素\n");    ListInsert_Sq(L,1,'a');    ListInsert_Sq(L,2,'b');    ListInsert_Sq(L,3,'c');    ListInsert_Sq(L,4,'d');    ListInsert_Sq(L,5,'e');    ListInsert_Sq(L,3,'q');    ListInsert_Sq(L,1,'q');    printf("(3)输出顺序表:");     DisplayList_Sq(L);    printf("(4)顺序表的长度=%d\n",LengthList_Sq(L));    printf("(5)顺序表为%s\n",(EmptyList_Sq(L)?"空":"非空"));    GetElemList_Sq(L,3,e);    printf("(6)顺序表的第三个元素是%c\n",e);    printf("(7)元素a的位置=%d\n",LocateElemList_Sq(L,'a'));    printf("(8)在第四个元素插入元素f\n");    ListInsert_Sq(L,4,'f');    printf("(9)输出顺序表:");    DisplayList_Sq(L);    printf("(10)删除第三个元素\n");    ListDelete_Sq(L,3,e);    printf("(11)f元素第一次出现的位置:");    printf("%d\n",LocateElemList_Sq(L,'f'));    printf("(12)输出顺序表:");    DisplayList_Sq(L);    printf("(13)释放顺序表\n");    DestroyList_Sq(L);}


结果展示


顺序表的各种基本运算


附录

相关资料

  1. 维基百科-单向链表


源代码


#include<stdio.h>   //EOF,NULL#include<malloc.h>  //malloc()#include<process.h>  //exit()#define  OK  1#define  ERROR  0#define  TRUE  1#define  FALSE  0typedef  int  Status;typedef  char    ElemType;typedef struct  LNode{    ElemType   data;    struct  LNode  *next;}LNode, *LinkList;Status InitList_L (LinkList &L) {    L = (LinkList)malloc(sizeof(LNode));    if (!L)   exit(0);    L->next = NULL;    return  OK;}// InitList_L  Status DestroyList_L (LinkList &L)  {    LinkList p,q;    p=L;    q=p->next;    while(q!=NULL){        free(p);        p=q;        q=p->next;    }    free(p);    return  OK;}Status EmptyList_L (LinkList L){    if(L->next==NULL)         return OK;    return ERROR;}Status LengthList_L(LinkList L){    LinkList p=L;    int i=0;    while(p->next!=NULL){        i++;        p=p->next;    }    return i;}Status DisplayList_L ( LinkList L) {    LinkList p=L->next;    while(p!=NULL){        printf("%c",p->data);        p=p->next;    }    printf("\n");    return OK;}Status ListInsert_L(LinkList &L, int i, ElemType e) {    LinkList l1=(LinkList)malloc(sizeof(LNode)) ;    LinkList  p = L;    int j;    for(j = 0; j<i-1;j++){    p = p->next;         }          if(!p||j>i-1)           return ERROR;          l1->data = e;    l1->next = p->next;    p->next = l1;    return OK; }//ListInsert_LStatus ListDelete_L(LinkList &L, int i, ElemType &e) {    LinkList q ,p = L;      int j;    for(j = 0; j<i-1;j++)        p =p->next;    if(!p->next|| j>i-1)           return ERROR;      q= p->next;    p->next = q->next;    e =q->data;    free(q);}//ListDelete_LStatus ListAdd (LinkList L , ElemType e){    LinkList p=L;    while(p->next){        p=p->next;    }    LinkList l1  = (LinkList)malloc(sizeof(LNode));    l1->data = e;    l1->next = NULL;        p->next = l1; } Status ListInverted(LinkList L,LinkList IL){    LinkList p=L->next;    while(p!=NULL){         ElemType e = p->data;         ListInsert_L(IL, 1, e);         p = p->next ;    }   } Status GetElemList_L (LinkList L, int i, ElemType &e) {    int j=0;    LinkList p=L;    while(j<i&&p){        ++j;        p=p->next;    }    if(!p||j>i)          return ERROR;    e=p->data;    return OK;}Status  LocateElemList_L(LinkList L,ElemType e) {       int i=0;    LinkList p=L;    while(p!=NULL&&p->data!=e) {        ++i;        p=p->next;    }    if(p==NULL)         return 0;    else         return i;}int main(){    LinkList L,IL;    ElemType e;    printf("(1)初始化单链表\n");    InitList_L(L);    InitList_L(IL);    printf("(2)依次插入a,b,c,d,e元素\n");    ListInsert_L(L,1,'a');    ListInsert_L(L,2,'b');    ListInsert_L(L,3,'c');    ListInsert_L(L,4,'d');    ListInsert_L(L,5,'e');    ListInsert_L(L,1,'b');//头插入法    ListAdd(L,'q');//尾插入法     printf("(3)输出单链表:");    DisplayList_L(L);    ListInverted(L,IL);//倒置     printf("(3.5)输出倒置单链表:");    DisplayList_L(IL);    printf("(4)单链表的长度=%d\n",LengthList_L(L));    printf("(5)单链表为%s\n",(EmptyList_L(L)?"空":"非空"));    GetElemList_L(L,3,e);    printf("(6)单链表的第三个元素是%c\n",e);    printf("(7)元素a的位置=%d\n",LocateElemList_L(L,'a'));    printf("(8)在第四个元素插入元素f\n");    ListInsert_L(L,4,'f');    printf("(9)输出单链表:");    DisplayList_L(L);    printf("(10)删除第三个元素\n");    ListDelete_L(L,3,e);    printf("(11)输出单链表:");    DisplayList_L(L);    printf("(12)释放单链表\n");    DestroyList_L(L);}
原创粉丝点击