实验目的及要求: 熟练掌握线性表的顺序存储法和链式存储法; 熟练掌握顺序表及链表的各种基本操作。 |
||||||||||
实验内容: 实验题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. 对顺序存储的线性表进行插入操作时:在插入元素时线性表可能已满,再行存储可能造成溢出,因此需要进行线性表已满的判断处理;在进行删除操作的时候,如果线性表为空,则根本无需进行删除操作。 |
c语言/c++(数据结构篇) 之 线性表的基本操作实例(2/7)
猜你喜欢
转载自blog.csdn.net/qq_59819866/article/details/131450839
今日推荐
周排行