`

线性表的单链表表示和实现

阅读更多
 /* c2-2.h 线性表的单链表存储结构 */
 struct LNode
 {
   ElemType data;
   struct LNode *next;
 };
 typedef struct LNode *LinkList; /* 另一种定义LinkList的方法 */

 

 /* bo2-2.c 单链表线性表(存储结构由c2-2.h定义)的基本操作(12个) */
 Status InitList(LinkList *L)
 { /* 操作结果:构造一个空的线性表L */
   *L=(LinkList)malloc(sizeof(struct LNode)); /* 产生头结点,并使L指向此头结点 */
   if(!*L) /* 存储分配失败 */
     exit(OVERFLOW);
   (*L)->next=NULL; /* 指针域为空 */
   return OK;
 }

 Status DestroyList(LinkList *L)
 { /* 初始条件:线性表L已存在。操作结果:销毁线性表L */
   LinkList q;
   while(*L)
   {
     q=(*L)->next;
     free(*L);
     *L=q;
   }
   return OK;
 }

 Status ClearList(LinkList L) /* 不改变L */
 { /* 初始条件:线性表L已存在。操作结果:将L重置为空表 */
   LinkList p,q;
   p=L->next; /* p指向第一个结点 */
   while(p) /* 没到表尾 */
   {
     q=p->next;
     free(p);
     p=q;
   }
   L->next=NULL; /* 头结点指针域为空 */
   return OK;
 }

 Status ListEmpty(LinkList L)
 { /* 初始条件:线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */
   if(L->next) /* 非空 */
     return FALSE;
   else
     return TRUE;
 }

 int ListLength(LinkList L)
 { /* 初始条件:线性表L已存在。操作结果:返回L中数据元素个数 */
   int i=0;
   LinkList p=L->next; /* p指向第一个结点 */
   while(p) /* 没到表尾 */
   {
     i++;
     p=p->next;
   }
   return i;
 }

 Status GetElem(LinkList L,int i,ElemType *e) /* 算法2.8 */
 { /* L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR */
   int j=1; /* j为计数器 */
   LinkList p=L->next; /* p指向第一个结点 */
   while(p&&j<i) /* 顺指针向后查找,直到p指向第i个元素或p为空 */
   {
     p=p->next;
     j++;
   }
   if(!p||j>i) /* 第i个元素不存在 */
     return ERROR;
   *e=p->data; /* 取第i个元素 */
   return OK;
 }

 int LocateElem(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType))
 { /* 初始条件: 线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0) */
   /* 操作结果: 返回L中第1个与e满足关系compare()的数据元素的位序。 */
   /*           若这样的数据元素不存在,则返回值为0 */
   int i=0;
   LinkList p=L->next;
   while(p)
   {
     i++;
     if(compare(p->data,e)) /* 找到这样的数据元素 */
       return i;
     p=p->next;
   }
   return 0;
 }

 Status PriorElem(LinkList L,ElemType cur_e,ElemType *pre_e)
 { /* 初始条件: 线性表L已存在 */
   /* 操作结果: 若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱, */
   /*           返回OK;否则操作失败,pre_e无定义,返回INFEASIBLE */
   LinkList q,p=L->next; /* p指向第一个结点 */
   while(p->next) /* p所指结点有后继 */
   {
     q=p->next; /* q为p的后继 */
     if(q->data==cur_e)
     {
       *pre_e=p->data;
       return OK;
     }
     p=q; /* p向后移 */
   }
   return INFEASIBLE;
 }

 Status NextElem(LinkList L,ElemType cur_e,ElemType *next_e)
 { /* 初始条件:线性表L已存在 */
   /* 操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继, */
   /*           返回OK;否则操作失败,next_e无定义,返回INFEASIBLE */
   LinkList p=L->next; /* p指向第一个结点 */
   while(p->next) /* p所指结点有后继 */
   {
     if(p->data==cur_e)
     {
       *next_e=p->next->data;
       return OK;
     }
     p=p->next;
   }
   return INFEASIBLE;
 }

 Status ListInsert(LinkList L,int i,ElemType e) /* 算法2.9。不改变L */
 { /* 在带头结点的单链线性表L中第i个位置之前插入元素e */
   int j=0;
   LinkList p=L,s;
   while(p&&j<i-1) /* 寻找第i-1个结点 */
   {
     p=p->next;
     j++;
   }
   if(!p||j>i-1) /* i小于1或者大于表长 */
     return ERROR;
   s=(LinkList)malloc(sizeof(struct LNode)); /* 生成新结点 */
   s->data=e; /* 插入L中 */
   s->next=p->next;
   p->next=s;
   return OK;
 }

 Status ListDelete(LinkList L,int i,ElemType *e) /* 算法2.10。不改变L */
 { /* 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值 */
   int j=0;
   LinkList p=L,q;
   while(p->next&&j<i-1) /* 寻找第i个结点,并令p指向其前趋 */
   {
     p=p->next;
     j++;
   }
   if(!p->next||j>i-1) /* 删除位置不合理 */
     return ERROR;
   q=p->next; /* 删除并释放结点 */
   p->next=q->next;
   *e=q->data;
   free(q);
   return OK;
 }

 Status ListTraverse(LinkList L,void(*vi)(ElemType))
 /* vi的形参类型为ElemType,与bo2-1.c中相应函数的形参类型ElemType&不同 */
 { /* 初始条件:线性表L已存在 */
   /* 操作结果:依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败 */
   LinkList p=L->next;
   while(p)
   {
     vi(p->data);
     p=p->next;
   }
   printf("\n");
   return OK;
 }

 

 /* algo2-5.c 实现算法2.11、2.12的程序 */
 #include"c1.h"
 typedef int ElemType;
 #include"c2-2.h"
 #include"bo2-2.c"

 void CreateList(LinkList *L,int n) /* 算法2.11 */
 { /* 逆位序(插在表头)输入n个元素的值,建立带表头结构的单链线性表L */
   int i;
   LinkList p;
   *L=(LinkList)malloc(sizeof(struct LNode));
   (*L)->next=NULL; /* 先建立一个带头结点的单链表 */
   printf("请输入%d个数据\n",n);
   for(i=n;i>0;--i)
   {
     p=(LinkList)malloc(sizeof(struct LNode)); /* 生成新结点 */
     scanf("%d",&p->data); /* 输入元素值 */
     p->next=(*L)->next; /* 插入到表头 */
     (*L)->next=p;
   }
 }

 void CreateList2(LinkList *L,int n)
 { /* 正位序(插在表尾)输入n个元素的值,建立带表头结构的单链线性表 */
   int i;
   LinkList p,q;
   *L=(LinkList)malloc(sizeof(struct LNode)); /* 生成头结点 */
   (*L)->next=NULL;
   q=*L;
   printf("请输入%d个数据\n",n);
   for(i=1;i<=n;i++)
   {
     p=(LinkList)malloc(sizeof(struct LNode));
     scanf("%d",&p->data);
     q->next=p;
     q=q->next;
   }
   p->next=NULL;
 }

 void MergeList(LinkList La,LinkList *Lb,LinkList *Lc)/* 算法2.12 */
 { /* 已知单链线性表La和Lb的元素按值非递减排列。 */
   /* 归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列 */
   LinkList pa=La->next,pb=(*Lb)->next,pc;
   *Lc=pc=La; /* 用La的头结点作为Lc的头结点 */
   while(pa&&pb)
     if(pa->data<=pb->data)
     {
       pc->next=pa;
       pc=pa;
       pa=pa->next;
     }
     else
     {
       pc->next=pb;
       pc=pb;
       pb=pb->next;
     }
   pc->next=pa?pa:pb; /* 插入剩余段 */
   free(*Lb); /* 释放Lb的头结点 */
   Lb=NULL;
 }

 void visit(ElemType c) /* ListTraverse()调用的函数(类型要一致) */
 {
   printf("%d ",c);
 }

 void main()
 {
   int n=5;
   LinkList La,Lb,Lc;
   printf("按非递减顺序, ");
   CreateList2(&La,n); /* 正位序输入n个元素的值 */
   printf("La="); /* 输出链表La的内容 */
   ListTraverse(La,visit);
   printf("按非递增顺序, ");
   CreateList(&Lb,n); /* 逆位序输入n个元素的值 */
   printf("Lb="); /* 输出链表Lb的内容 */
   ListTraverse(Lb,visit);
   MergeList(La,&Lb,&Lc); /* 按非递减顺序归并La和Lb,得到新表Lc */
   printf("Lc="); /* 输出链表Lc的内容 */
   ListTraverse(Lc,visit);
 }

 

分享到:
评论

相关推荐

    数据结构课件 线性表 单链表 栈和队列 串 数组和广义表 树和二叉树 C语言版

    本课件聚焦于数据结构的基础部分,特别是线性表、单链表、栈和队列、串、数组和广义表,以及树和二叉树,所有这些概念都是用C语言实现的。 1. **线性表**:线性表是最基本的数据结构,它是由n(n≥0)个相同类型...

    数据机构 线性表 单链表 栈 汉诺塔 迷宫求解 等的演示

    单链表是线性表的一种链式实现,每个元素(节点)包含数据部分和一个指向下一个节点的指针。单链表的插入和删除操作通常比数组快,因为只需要改变相邻节点的指针即可。不过,查找元素需要从头节点开始遍历,效率较低...

    线性表的单链表实现

    通过这些类和测试,我们可以了解单链表如何作为线性表的一种实现,以及如何在Java中使用它来进行基本操作。理解单链表的工作原理对于学习数据结构和算法至关重要,因为它构成了许多复杂数据结构的基础,如双向链表、...

    数据结构C语言版-线性表的单链表存储结构表示和实现.doc

    "数据结构C语言版-线性表的单链表存储结构表示和实现" 本文档介绍了线性表的单链表存储结构表示和实现,使用C语言编写,提供了多种操作函数,包括初始化、销毁、清空、判断空表、获取元素、获取元素位序等。 数据...

    数据结构C语言版-线性表的单链表存储结构表示和实现优质资料.doc

    数据结构C语言版-线性表的单链表存储结构表示和实现优质资料.doc 知识点摘要: 1. 数据结构的基本概念:数据结构是计算机科学中的一种基本概念,指的是数据的组织和存储方式。 2. 线性表的概念:线性表是一种基本...

    线性表的链式表示和实现

    "线性表的链式表示和实现" 线性表是一种基本的数据结构,链式表示是线性表的一种常见的存储结构。在链式表示中,每个元素是一个独立的结点,结点中包含数据域和指针域,指针域指向下一个结点。链式表示的优点是可以...

    数据结构实战--线性表的单链表实现

    线性表是一种基本的数据结构,由相同类型元素的有序序列组成,而单链表是其一种常见表示方式。 单链表是一种动态数据结构,每个元素(称为节点)包含两部分:数据域和指针域。数据域存储实际的数据,指针域则存储...

    线性表的链式表示与实现-单链表类型的定义及基本操作

    内容概要:该文档详述了通过实验形式,掌握了线性表的链式表示与实现的基本原理和技术细节。具体从理论介绍入手,涵盖了线性表的概念定义、数据操作等基础知识;随后重点讲解了如何采用C语言完成单链表的数据结构...

    数据结构---线性表之单链表(C语言)

    除了基本的创建、插入和删除,还可以实现单链表的反转、查找、排序等高级操作。例如,反转单链表可以使用迭代或递归方法,查找特定值的节点则需要遍历链表。 五、注意事项 在处理链表时,需要注意内存管理。创建新...

    2-2基于链式存储的线性表的表示与实现.pdf

    《基于链式存储的线性表的表示与实现》 线性表是一种基本的数据结构,由有限个相同类型元素组成,具有线性顺序。在计算机科学中,线性表的链式存储是一种常见的方式,它将数据元素分散存储在内存的不同位置,并通过...

    栈和线性表的一种实现

    在数组实现时,通常使用两个指针分别表示队头和队尾;链表实现时,队头和队尾的修改则更为直观。 在实际编程中,栈和线性表的实现可以根据需求进行优化,比如使用动态数组(如C++的std::vector或Java的ArrayList)...

    线性表的C语言实现

    在C语言的编程实践中,理解并熟练掌握线性表的实现和操作,对于提升编程能力至关重要。 8. **代码实现** 文件"sqlist"可能包含了线性表的C语言实现源代码,通常会包含头文件定义、结构体定义、函数声明以及对应的...

    实验1-2 线性表-单链表.doc

    2. **理解单链表的存储表示**:学生需要明确单链表的内部结构,即每个节点由两部分组成——数据域和指针域。数据域存储实际数据,而指针域则指向下一个节点。 3. **掌握单链表的基本操作**:包括创建、插入、删除和...

    数据结构线性表简单程序 单链表

    为了实现单链表,我们需要定义一个结构体或类来表示节点,包含数据和指针成员。例如,在C++中可以这样定义: ```cpp struct LinkNode { int data; LinkNode* next; }; ``` 然后,我们可以编写函数来实现上述...

    线性表的基本操作实现及其应用实验报告

    这里定义了一个带有整型数据成员`data`和指向同类节点的指针`next`的结构体`LNode`,并通过指针类型`LinkList`来表示单链表的头指针。 - **初始化单链表** ```c++ LinkList LinkedListInit() { // 链表初始化及...

    数据结构线性表的链式表示和实现.pdf

    数据结构线性表的链式表示和实现 一、链式表示的基本概念 链式表示是一种数据结构,它使用链表来存储数据。链表是一种动态的数据结构,它由多个结点组成,每个结点包含了一个数据元素和一个指针,指向下一个结点。...

    算法-理论基础- 线性表- 单链表(包含源程序).rar

    单链表是计算机科学中数据结构的一个重要概念,它属于线性表的一种,主要用于存储和组织数据。在本文中,我们将深入探讨单链表的理论基础、操作以及它在实际编程中的应用。 线性表是一种基本的数据结构,由n(n &gt;= ...

    数据结构线性表的顺序和链式实现

    "LinkList.cpp"文件应该包含了链式表的C++实现,包括单链表和双向链表的可能性,同样覆盖了基本操作的实现。 在C语言实现的顺序表中,我们可能会遇到的问题包括数组大小的预先设定、动态扩容的策略以及如何避免数组...

    数据结构c版(1)-线性表之单链表代码

    在这个“数据结构C版(1)-线性表之单链表代码”中,我们将深入探讨线性表这一基础数据结构的C语言实现,特别是单链表。 单链表是一种线性数据结构,其中的元素并非在内存中连续存储,而是通过指针连接。每个元素...

    利用带头结点的单链表实现两个集合的并、交、差运算.docx

    利用带头结点的单链表实现两个集合的并、交、差运算 本文档的主要内容是使用带头结点的单链表实现两个集合的并、交、差运算。该文档共分为八个部分,分别是题目重述、题目功能描述、概要设计图、程序源代码及注释、...

Global site tag (gtag.js) - Google Analytics