《数据结构》实验报告(二)之线性表的基本操作

二、实验内容

实验题:实现单链表各种基本运算的算法

目的:领会单链表存储结构和掌握单链表中各种基本运算算法设计

内容:实现单链表的各种基本运算和整体建表算法(假设单链表的元素类型ElemType为char),完成如下功能:

   (1)初始化单链表h;1

   (2)依次采用尾插法插入a、b、c、e、d元素;1

   (3)输出单链表h;1

   (4)输出单链表h长度;1

   (5)判断单链表h是否为空;1

   (6)输出单链表h的第3个元素;1

   (7)输出元素a的位置;1

   (8)在第4个元素位置上插入f元素;1

   (9)输出单链表h;1

   (10)删除单链表h的第3个元素;

   (11)输出单链表h;

   (12)释放单链表h。

程序代码:(不允许粘图,重点语句加上注释)

#include<stdio.h>

#include<malloc.h>

typedef char ElemType;

typedef struct LNode

{

   ElemType date;

   struct LNode* next;

}LinkNode;

void InitList(LinkNode*& L)//(1)初始化单链表h;

{

   L = (LinkNode*)malloc(sizeof(LinkNode));

   L->next = NULL;

}

//(2)依次采用尾插法插入a、b、c、e、d元素;

bool ListInsert(LinkNode*& L, int i, ElemType e)

{

   int j = 0;

   LinkNode* p = L, * s;

   if (i <= 0)

       return false;

   while (j < i - 1 && p != NULL)//因为要插入到第i个位置所以是i-1

   {

       j++;

       p = p->next;

   }

   if (p == NULL)

       return false;

   else

   {

       s = (LinkNode*)malloc(sizeof(LinkNode));

       s->date = e;

       s->next = p->next;

       p->next = s;

       return true;

   }

}

//(3)输出单链表h;

void DispList(LinkNode* L)

{

   LinkNode* p = L->next;

   while (p != NULL)

   {

       printf("%c", p->date);

       p = p->next;

   }

   printf("\n");

}

//(4)输出单链表h长度;

int ListLength(LinkNode* L)

{

   int j = 0;

   LinkNode* p = L;

   while (p != NULL)

   {

       p = p->next;

       j++;

   }

   return(j);

}

//(5)判断单链表h是否为空;

bool ListEmpty(LinkNode* L)

{

   return(L->next == NULL);

}

//(6)输出单链表h的第3个元素;

bool GetElem(LinkNode* L, int i, ElemType& e)

{

   int j = 0;

   LinkNode* p = L;

   if (i <= 0)

       return false;

   while (j < i && p != NULL)

   {

       p = p->next;

       j++;

   }

   if (p == NULL)

       return false;

   else

   {

       e = p->date;

       return true;

   }

}

//(7)输出元素a的位置;

bool LocateElem(LinkNode* L, ElemType e)

{

   int j = 0;

   LinkNode* p = L;

   while (p->date != e && p != NULL)

   {

       j++;

       p = p->next;

   }

   if (p == NULL)

       return false;

   else

   {

       return j;

   }

}

//(10)删除单链表h的第3个元素;

bool ListDelete(LinkNode*& L, int i, ElemType& e)

{

   LinkNode* p = L, * s;

   int j = 0;

   if (i <= 0)

       return false;

   while (j < i - 1 && p != NULL)

   {

       j++;

       p = p->next;

   }

   if (p == NULL)

       return false;

   else

   {

       s = p->next;

       if (s == NULL)

          return false;

       e = s->date;

       p->next = s->next;

       free(s);

       return true;

   }

}

//(12)释放单链表h。

void DestroyList(LinkNode*& L)

{

   LinkNode* pre = L, * p = L->next;

   while (p != NULL)

   {

       free(pre);

       pre = p;

       p = pre->next;

   }

   free(pre);

}

int main()

{

   LinkNode* h;

   ElemType e;

   printf("单链表的基本运算如下:\n");

   printf("(1)初始化单链表h.\n");

   InitList(h);

   printf("(2)依次采用尾插法插入a,b,c,d,e元素.\n");

   ListInsert(h, 1, 'a');

   ListInsert(h, 2, 'b');

   ListInsert(h, 3, 'c');

   ListInsert(h, 4, 'd');

   ListInsert(h, 5, 'e');

   printf("(3)输出单链表h:");

   DispList(h);

   printf("(4)输出单链表h的长度:%d\n", ListLength(h));

   printf("(5)判断单链表h是否为空:%s\n", (ListEmpty(h) ? "空" : "非空"));

   GetElem(h, 3, e);

   printf("(6)输出单链表h的第3个元素:%c\n", e);

   printf("(7)输出元素a的位置:%d\n", LocateElem(h, 'a'));

   printf("(8)在第4个元素位置上插入f元素.\n");

   ListInsert(h, 4, 'f');

   printf("(9)输出单链表h:");

   DispList(h);

   printf("(10)删除单链表h的第3个元素.\n");

   ListDelete(h, 3, e);

   printf("(11)输出单链表h:");

   DispList(h);

   printf("(12)释放单链表h\n");

   DestroyList(h);

}

程序测试及运行结果:

分析与讨论:

  1. 实践了使用线性表对数据进行处理,更进一步掌握数组法与链表法的使用与转换。
  2. 在设计程序时,上层设计一定要事先想好,否则到后面需要修改上层设计的时候,下层实现基本是需要全部推倒重做。
  3. 实验程序应该多些注释,这样方便别人读懂你的程序。
  4. 程序运行过程中要多添加printf语句,提示程序员属于什么数据。
  5. 写程序时要细心,不要漏分号。
  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

了一li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值