数据结构:实验二 单链表

一、    实验目的

  1. 掌握单链表的存储结构特点
  2. 掌握单链表中的各种基本运算算法设计。

二、    实验内容与要求

    编写一个程序exp2-2.cpp,实现单链表的各种基本运算和下面main函数中的每一步功能。

  1. 初始化单链表L
  2. 依次采用尾插法插入’a’,’b’,’c’,’d’,’e’五个字符元素;
  3. 输出单链表L
  4. 依次采用头插法插入’1’,’2’,’3’三个字符元素;
  5. 输出单链表L
  6. 输出单链表L中序号为3的元素。(元素序号从1开始);
  7. 输出元素’a’在链表中的位置(即序号);
  8. 在第4个元素位置上插入’*’元素;
  9. 输出单链表L
  10. 删除L中第3个元素;
  11. 输出单链表L

三、    实验步骤

1.单链表结点类型声明:

typedef char ElemType;

typedef struct LNode {

 ElemType data;

 struct LNode *next;

} SqList;

2.线性表基本运算在单链表上的实现

void InitList(SqList *&L) {
 L= (SqList *)malloc(sizeof(SqList));  //分配存放线性表的空间
 L->next=NULL;     //置空线性表长度为0
}

void DestroyList(SqList *&L) {       //销毁线性表(DestroyList)
 SqList *pre=L,*p=L->next;
 while(p!=NULL) {
  free(pre);
  pre=p;
  p=pre->next;
 }
 free(pre);
}
void DispList(SqList *L) {          //输出线性表,
 SqList *p=L->next;
 while(p!=NULL) {
  printf("%c ",p->data);
  p=p->next;
 }
 printf("\n");
}
bool GetElem(SqList *L,int i,ElemType &e) {
 int j=0;
 SqList *p=L;

 if(i<=0)
  return false;
 while(j<i&&p!=NULL) {
  j++;
  p=p->next;
 }
 if(p==NULL)
  return false;
 else {
  e=p->data;
  return true;
 }
}
int LocateElem(SqList *L,ElemType e) {
 int i=1;
 SqList *p=L->next;
 while(p!=NULL&&p->data!=e) {
  p=p->next;
  i++;
 }
 if(p==NULL)
  return (0);
 else
  return (i);
}
void CreateListR(SqList *&L,ElemType a[],int n) {

 SqList *s,*r;
 L= (SqList *)malloc(sizeof(SqList));
 r=L;
 for(int i=0; i<n; i++) {
  s=(SqList *)malloc(sizeof(SqList));
  s->data=a[i];
  r->next=s;
  r=s;
 }
 r->next=NULL;
}
bool ListInsert(SqList *L,int i,ElemType e) {   //插入数据元素;
 int j=0;
 SqList *p=L,*s;
 if(i<=0)
  return false;
 while(j<i-1&&p!=NULL) {
  j++;
  p=p->next;
 }
 if(p==NULL)
  return false;
 else {
  s=(SqList *)malloc(sizeof(SqList));
  s->data=e;
  s->next=p->next;
  p->next=s;
  return true;
 }
}
bool ListDelete(SqList *&L,int i,ElemType &e) {     //删除数据元素;
 int j=0;
 SqList *p=L,*q;
 if(i<=0)
  return false;
 while(j<i-1&&p!=NULL) {
  j++;
  p=p->next;
 }
 if(p==NULL)
  return false;
 else {
  q=p->next;
  if(q==NULL)
   return false;
  e=q->data;
  p->next=q->next;
  free(q);
  return true;
 }
}
void CreateListF(SqList *&L, ElemType b[], int n) { //头插法
 SqList * s;
 L = (SqList *)malloc(sizeof(SqList));    //创建头节点
 L->next = NULL;
 for(int i = 0;
 i < n; i++){
  s = (SqList *)malloc(sizeof(SqList));//创建新节点s
  s->data = b[i];
  s->next = L->next;    //将节点s插在开始接点之前,头节点之后
  L->next = s;
 }
}
void DispList2(SqList *L){
 SqList *p = L->next;    //p指向首节点
 while(p != NULL){    //p不为NULL,输出p节点的data
  printf("%d ", p->data);
  p = p->next;    //p移向下一个节点
 }
 printf("\n");
}

3. 程序exp2-2.cpp的设计,及完成实验要求中的功能

(补齐实现对应功能的代码 )   

// 1) 初始化顺序表L。

//2)  依次插入a,b,c,d,e元素,字符类型

//3)  输出顺序表L

 //4)  输出顺序表L的长度

//5)  判断顺序表L是否为空

//6)  输出顺序表L的第3个元素

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

//8)  在第4个元素位置上插入f元素

/9)  输出顺序表L

 //10) 删除顺序表L的第3个元素

//11) 输出顺序表L  

#include<stdio.h>

#include<stdlib.h>

#include<malloc.h>

typedef char ElemType;

typedef struct LNode {

 ElemType data;

 struct LNode *next;

} SqList;

void InitList(SqList *&L) {

 L= (SqList *)malloc(sizeof(SqList));  //分配存放线性表的空间

 L->next=NULL;     //置空线性表长度为0

}



void DestroyList(SqList *&L) {       //销毁线性表(DestroyList)

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

 while(p!=NULL) {

  free(pre);

  pre=p;

  p=pre->next;

 }

 free(pre);

}

void DispList(SqList *L) {          //输出线性表,

 SqList *p=L->next;

 while(p!=NULL) {

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

  p=p->next;

 }

 printf("\n");

}

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

 int j=0;

 SqList *p=L;



 if(i<=0)

  return false;

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

  j++;

  p=p->next;

 }

 if(p==NULL)

  return false;

 else {

  e=p->data;

  return true;

 }

}

int LocateElem(SqList *L,ElemType e) {

 int i=1;

 SqList *p=L->next;

 while(p!=NULL&&p->data!=e) {

  p=p->next;

  i++;

 }

 if(p==NULL)

  return (0);

 else

  return (i);

}

void CreateListR(SqList *&L,ElemType a[],int n) {



 SqList *s,*r;

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

 r=L;

 for(int i=0; i<n; i++) {

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

  s->data=a[i];

  r->next=s;

  r=s;

 }

 r->next=NULL;

}

bool ListInsert(SqList *L,int i,ElemType e) {   //插入数据元素;

 int j=0;

 SqList *p=L,*s;

 if(i<=0)

  return false;

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

  j++;

  p=p->next;

 }

 if(p==NULL)

  return false;

 else {

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

  s->data=e;

  s->next=p->next;

  p->next=s;

  return true;

 }

}

bool ListDelete(SqList *&L,int i,ElemType &e) {     //删除数据元素;

 int j=0;

 SqList *p=L,*q;

 if(i<=0)

  return false;

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

  j++;

  p=p->next;

 }

 if(p==NULL)

  return false;

 else {

  q=p->next;

  if(q==NULL)

   return false;

  e=q->data;

  p->next=q->next;

  free(q);

  return true;

 }

}

void CreateListF(SqList *&L, ElemType b[], int n) { //头插法

 SqList * s;

 L = (SqList *)malloc(sizeof(SqList));    //创建头节点

 L->next = NULL;

 for(int i = 0;

 i < n; i++){

  s = (SqList *)malloc(sizeof(SqList));//创建新节点s

  s->data = b[i];

  s->next = L->next;    //将节点s插在开始接点之前,头节点之后

  L->next = s;

 }

}

void DispList2(SqList *L){

 SqList *p = L->next;    //p指向首节点

 while(p != NULL){    //p不为NULL,输出p节点的data

  printf("%d ", p->data);

  p = p->next;    //p移向下一个节点

 }

 printf("\n");

}

 int  main()

{

      ElemType e,a[5]={'a','b','c','d','e'},b[3]={1,2,3};

      SqList *L;

      printf("单链表的计算功能如下:\n");

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

      InitList(L);

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

      CreateListR(L,&a[0],5);

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

      DispList(L);

      GetElem(L,3,e);

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

      printf("  7.输出单链表中元素a的位置 = %d\n",LocateElem(L,'a'));

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

      ListInsert(L,4,'*');

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

      DispList(L);

      printf("  10.删除L的第3个元素\n");

      ListDelete(L,3,e);

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

      DispList(L);

      printf("  4.依次采用头插法插入1,2,3元素\n");

      CreateListF(L,&b[0],3);

      printf("  5.输出单链表L:   ");

      DispList2(L);

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

      DestroyList(L);

    return 0;

}

四、编译运行结果截图:

如需源文件,请私信作者,无偿

  • 18
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值