c语言/c++(数据结构篇) 之 线性表的基本操作实例(2/7)

实验目的及要求: 

熟练掌握线性表的顺序存储法和链式存储法;

熟练掌握顺序表及链表的各种基本操作。

实验内容:

实验题1:利用顺序表及链表完成有序表的归并

目的:熟练掌握顺序存储法和链式存储法,采用两种方法完成有序表的归并。

内容:设La和Lb是两个具有相同数据对象的线性表,都按元素非递减有序的形式存放。要将两个表合并成一个新的非递减有序的线性表Lc。

如:La ={3,5,8,11}

Lb ={2,6,8,9,11,15,20}

Lc ={2,3,5,6,8,8,9,11,11,15,20}

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

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

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

(1)初始化单链表h;

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

(3)输出单链表h;

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

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

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

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

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

(9)输出单链表h;

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

(11)输出单链表h;

(12)释放单链表h。

实验步骤与程序:

实验1:

#include<stdlib.h>

#include<stdio.h>

typedef struct node

{

      int data;

      int len;

      struct node *next;

}node;

node *creatlist()

{

      int n;

      printf("线性表元素个数是?\n");

      scanf("%d", &n);

      node *head = (node *)malloc(sizeof(node));

      head->next = NULL;

      node *q = head;

      printf("升序输入 %d 个元素\n", n);

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

      {

            node *p = (node *)malloc(sizeof(node));

            scanf("%d", &p->data);

      p->next = NULL;

            q->next = p;

            q = p;

      }

      head->len = n;

      return head;

}

node *insertnode(node *head, int pos, int e)

{

      node *p = head;

      int j = 0;

      while (p&&j < pos - 1)

      {

            p = p->next;

            j++;

      }

      if (!p || j > pos - 1)

      {

            return head;

      }

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

      s->data = e;

      s->next = p->next;

      p->next = s;

      head->len++;

      return head;

}

node *mergelist(node *head1, node *head2)

{

      node *head = (node *)malloc(sizeof(node));

      head->next=NULL;

      int len = head1->len + head2->len;

      head->len = len;

      node *p1 = head1->next; node *p2 = head2->next;

      int i = 1;

      while (p1&&p2)

      {

            if (p1->data <= p2->data)

            {

                  head = insertnode(head, i, p1->data);

                  p1 = p1->next;

            }

            else

            {

                  head = insertnode(head, i, p2->data);

                  p2 = p2->next;

            }

            i++;

      }

      while (p1)

      {

            head = insertnode(head, i, p1->data);

            p1=p1->next;

            i++;

      }

      while (p2)

      {

            head = insertnode(head, i, p2->data);

            p2=p2->next;

            i++;

      }

      return head;

}

void printlist(node *head)

{

      node *p = head->next;

      while (p)

      {

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

            p = p->next;

      }

      printf("\n");

}

int main()

{

      node *head1;

      printf("创建第一个线性表\n");

      head1 = creatlist();

      printlist(head1);

      node *head2;

      printf("创建第二个线性表表\n");

      head2 = creatlist();

      node *head;

      printf("合并链表\n");

      head = mergelist(head1, head2);

      printlist(head);

      return 0;

}

实验2:

#include <iostream>

#include <stdlib.h>

using namespace std;

typedef char ElemType;

typedef struct LNode{

      ElemType data;

      struct LNode *next;

}LinkList;

void InitList(LinkList *&L){    //初始化线性表

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

      L->next=NULL;

}

void CreateListR(LinkList *&L,ElemType a[],int n){  //尾插法插入元素

      LinkList *s,*r;

      int i;

      r=L;

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

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

            s->data=a[i];

            r->next=s;

            r=s;

      }

      r->next=NULL;

}

bool ListEmpty(LinkList *L){   //判断是否为空表

      return(L->next==NULL);

}

int ListLength(LinkList *L){   //求单链表长度

      int n=0;

      LinkList *p=L;

      while(p->next!=NULL){

            n++;

            p=p->next;

      }

      return(n);

}

void DispList(LinkList *L){    //输出单链表元素

      LinkList *p = L->next;

      while(p!=NULL){

            cout<<p->data<<" ";

            p=p->next;

      }

      cout<<endl;

}

bool GetElem(LinkList *L,int i,ElemType &e){   //查找第i个节点的元素

      int j=0;

      LinkList * p = L;

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

            j++;

            p=p->next;

      }

      if(p==NULL)

            return false;

      else{

            e=p->data;

            return true;

      }

}

int LocateList(LinkList *L,ElemType e){    //按元素值查找

      int i=1;

      LinkList *p=L->next;

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

            p=p->next;

            i++;

      }

      if(p==NULL)

            return(0);

      else return(i);

}

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

      int j=0;

      LinkList *p=L,*s;

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

            j++;

            p=p->next;

      }

      if(p==NULL)

            return false;

      else{

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

            s->data=e;

            s->next=p->next;

            p->next=s;

            return true;

      }

}

bool ListDelete(LinkList *&L,int i,ElemType &e){   //删除数组元素

      int j=0;

      LinkList *p=L,*q;

      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 DestroryList(LinkList *&L){      //销毁单链表

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

      while(p!=NULL){

            free(pre);

            pre=p;

            p=pre->next;

      }

      free(pre);

}

int main(){

      LinkList *L;

      ElemType x;

      char a[]={'a','b','c','d','e'};

      InitList(L);

      CreateListR(L,a,5);

      cout<<"Display1: ";

      DispList(L);

      cout<<"Length1: "<<ListLength(L)<<endl;

      if(!ListEmpty(L))

            cout<<"Not Empty"<<endl;

      else cout<<"Empty"<<endl;

      GetElem(L,3,x);

      cout<<"The third is "<<x<<endl;

      cout<<"'a' is in "<<LocateList(L,'a')<<endl;

      ListInsert(L,4,'f');

      cout<<"Display2: ";

      DispList(L);

      ListDelete(L,3,x);

      cout<<"Display3: ";

      DispList(L);

      DestroryList(L);

      return 0;

}

运行结果:

实验1:

实验2:

结果分析与讨论:

1.线性表的顺序存储法和链式存储法最好情况是插入/删除最后一个元素,O(1)。最差情况是插入/删除第一个元素,O(n)线性表的顺序存储结构中,在存读数据时,不管哪个位置,时间复杂度都是O(1);插入删除,时间复杂度都是O(n)

2. 对顺序存储的线性表进行插入操作时:在插入元素时线性表可能已满,再行存储可能造成溢出,因此需要进行线性表已满的判断处理;在进行删除操作的时候,如果线性表为空,则根本无需进行删除操作。

猜你喜欢

转载自blog.csdn.net/qq_59819866/article/details/131450839