1、实验二 线性表的基本操作
一、实验目的
1.掌握用 C++/C语言调试程序的基本方法。
2.掌握线性表的顺序存储和链式存储的基本运算,如插入、删除等.
二、实验要求
1.C++/C完成算法设计和程序设计并上机调试通过.
2.撰写实验报告,提供实验结果和数据。
3. 分析算法,要求给出具体的算法分析结果,包括时间复杂度和空间复杂度,并简要给出算法设计小结和心得。
三、实验内容:
1。 分析并运行以下各子程序的主要功能。
程序1:顺序存储的线性表和运算
#include
2、int n; /*insert in a seqlist*/ int sq_insert(int list[], int *p_n, int i, int x) {int j; if (i〈0 || i>*p_n) return(1); if (*p_n==MAXSIZE) return(2); for (j=*p_n+1; j〉i; j——) list[j]=list[j-1]; list[i]=x; (*p_n)++; return(0); } /*delete in a seq list*/ int sq_delete(int list[]
3、 int *p_n, int i) {int j; if (i〈0 || i>=*p_n) return(1); for (j = i+1; j〈=*p_n; j++) list[j-1] = list[j]; (*p_n)—-; return(0); } void main() {int i,x,temp; printf(”please input the number for n\n”); printf("n=”); scanf("%d",&n); for (i=0; i<=n; i++) {printf(”list[%d
4、]=",i); scanf(”%d",&list[i]);} printf(”The list before insertion is\n”); for (i=0; i<=n; i++) printf(”%d ",list[i]); printf(”\n”); printf(”please input the position where you want to insert a value\nposition=”); scanf(”%d",&i); printf(”please input the value you want to insert。\n
5、x="); scanf("%d”,&x); temp=sq_insert(list,&n,i,x); switch(temp) {case 0:printf(”The insertion is successful!\n"); printf(”The list is after insertion is\n”); for(i=0; i〈=n; i++) printf(”%d ",list[i]); printf(”\n"); printf("%d\n”,n); break; case 1: case 2:printf(”The inser
6、tion is not successful!\n”);break;} /*deleting*/ printf("The list before deleting is\n"); for (i=0; i<=n; i++) printf("%d ”,list[i]); printf(”\n"); printf(”please input the position where you want to delete a value\nposition="); scanf(”%d”,&i); temp=sq_delete(list,&n,i); switch(temp
7、 {case 0:printf(”The deleting is successful!\n”); printf("The list is after deleting is\n"); for(i=0; i<=n; i++) printf(”%d ",list[i]); printf("\n”); printf(”%d",n); break; case 1:printf("The deleting is not successful!");break;} } 2。 分析并运行以下各子程序的主要功能. 程序2链式存储的线性表和运算 #inclu
8、de〈stdio。h〉 #include〈malloc.h〉 struct node{ char data; struct node *next; }; typedef struct node NODE; /*This function creates a link_list with N nodes.*/ NODE *create_link_list(int n) {int i; NODE *head, *p, *q; if (n==0) return NULL; head = (NODE *) malloc(sizeof(NODE)); p = he
9、ad; printf(”Please input %d chars for the link list\n",n); for (i=0; i〈n; i++) {scanf("%c ", &(p—>data)); q=(NODE *)malloc(sizeof(NODE)); printf("test3\n”); p->next=q; p=q;} scanf(”%c ”,&(p->data)); getchar(); p-〉next=NULL; return (head);} /*This function inserts a nod
10、e whose value is b*/ /*before the node whose value is a, if the node is not exist,*/ /*then insert it at the end of the list*/ void insert(NODE **p_head, char a, char b) {NODE *p, *q; q = (NODE *)malloc(sizeof(NODE)); q—〉data = b; q—〉next =NULL; if (* p_head == NULL) * p_head = q; el
11、se {p=(NODE*)malloc(sizeof(NODE)); p = * p_head; while (p—〉data != a && p—>next != NULL) p = p->next; q—>next = p—〉next; p-〉next = q;} } /*The function deletes the node whose value is a,*/ /*if success, return 0, or return 1*/ int deletenode(NODE **p_head, char a) {NODE *
12、p, *q; q=*p_head; if (q==NULL) return(1); if (q—>data == a) {* p_head = q-〉next; free(q); return (0);} else {while (q->data != a && q—>next != NULL) {p = q; q = q—>next;} if (q—>data == a) {p->next = q—〉next; free(q); return(0);} else return(1);}
13、 } void main() { NODE *my_head,*p; /* create a link list with m nodes */ int m; char ch_a,ch_b; printf("please input the number of nodes for the link_list\nm="); scanf(”%d”,&m); getchar(); printf(”test1\n”); my_head = (NODE *) malloc(sizeof(NODE)); my_head=create_link_list(m);
14、/*Output the link list*/ printf(”The link list is like:\n”); p=my_head; while (p != NULL) {printf(”%c ",p—>data); p=p—〉next; } printf(”\n"); /*insert a node whose value is b before a*/ printf("Please input the position for a\n ch_a=”); getchar(); scanf(”%c",&ch_a); getchar
15、 printf("Please input the value that you want to insert\n ch_b=”); scanf(”%c",&ch_b); getchar(); insert(&my_head,ch_a,ch_b); printf("The link list after insertion is like:\n"); p=my_head; while (p != NULL) {printf("%c ”,p—>data); p=p—〉next; } printf(”\n”); /*delete a no
16、de whose value is a*/ printf("Please input the position for a a=”); scanf("%c”,&ch_a); getchar(); deletenode(&my_head,ch_a); printf("The link list after deleting is like:\n"); p=my_head; while (p != NULL) {printf("%c ”,p->data); p=p—>next; } printf("\n”); } 3. 运行以下程序并分析各子函
17、数的主要功能。
#include 〈stdio。h>
#include
18、Pri—>pNext—〉data〈pnode->data) { pnode-〉pNext=pPri—〉pNext; pPri->pNext=pnode; break; } pPri=pPri—〉pNext; } if (pPri—>pNext==NULL)//如果要插入的结点最小 { pPri—〉pNext=pnode; } } //输出链表 void printLinkedList(pNode head) { pNode temp=head-〉pNext; while (temp!=NULL) { pr
19、intf("%d ”,temp-〉data); temp=temp->pNext; } } //从链表中删除结点 void delformList(pNode head,int data) { pNode temp=head—〉pNext; pNode pPri=head; while (temp!=NULL) { if (temp—〉data==data) { pPri-〉pNext=temp-〉pNext; free(temp); break; } pPri=temp; temp=temp—>pNex
20、t; } } void main() { pNode head=(pNode)malloc(sizeof(struct tagNode));//给头指针分配空间 pNode pTemp=NULL; int temp; head—〉pNext=NULL;//比较好的习惯就是分配好空间,马上赋值 printf("请输入要放入链表中的数据,以—1结尾:"); //读入数据,以—1结尾,把数据插入链表中 scanf(”%d",&temp); while (temp!=-1) { pTemp=(pNode)malloc(sizeof(struct ta
21、gNode)); pTemp->data=temp; pTemp-〉pNext=NULL; insertList(head,pTemp); scanf("%d”,&temp); } printf("降序排列的链表为:\n”); printLinkedList(head); printf("\n"); //下面的代码当删除函数编写成功后,可以取消注释,让其执行,主要是调用函数实现链表结点的删除 //printf("请输入要删除数,以—1结尾:"); //scanf("%d”,&temp); //while (temp!=-1) //{
22、 // delformList(head,temp); // scanf(”%d”,&temp); //} //printf(”删除节点后,链表中剩余数据为:”); //printLinkedList(head); //printf(”\n"); } 四、思考与提高 试将以上链表改为有序表,并分析有序表有哪些显著的优点和缺点? 库函数载和常量定义:(代码,C++) #include〈iostream〉 using namespace std; const int MaxSize=100; (1)顺序表存储结构的定义(类的声明):(代码) template
23、 〈class datatype〉 //定义模板类SeqList class SeqList { public: SeqList( ); //无参构造函数 SeqList(datatype a[ ], int n); //有参构造函数 ~SeqList(){}; //析构函数为空 int Length(); //求线性表的长度 datatype Get(int i); //按位查找,取线性表的第i个元素 int Locate(datatype it
24、em); //查找元素item void Insert(int i, datatype item); //在第i个位置插入元素item datatype Delete(int i); //删除线性表的第i个元素 void display(); //遍历线性表,按序号依次输出各元素 private: datatype data[MaxSize]; //存放数据元素的数组 int length; //线性表的长度 }; (2)初始化顺序表算法实现(不带参数的构造函数) /* *输 入:
25、无
*前置条件:顺序表不存在
*功 能:构建一个顺序表
*输 出:无
*后置条件:表长为0
*/
实现代码:
template 26、datatype>
SeqList 27、/
实现代码:
template 〈class datatype>
void SeqList 28、5)删除线性表中第i个元素算法
/*
*输 入:要删除元素位置i
*前置条件:顺序表存在,i要合法
*功 能:删除顺序表中位置为i的元素
*输 出:无
*后置条件: 顺序表册除了一个元素,表长减1
*/
实现代码:
template 29、cout<〈"i不合法!”< 30、{
if(length==0)
{
cout<<”表为空,无法输出!”〈 31、线性表中查找e值,返回该元素的位序算法
/*
*输 入:查询元素值e
*前置条件:顺序表存在
*功 能:按值查找值的元素并输出位置
*输 出:查询元素的位置
*后置条件:无
*/
实现代码:
template 〈class datatype〉
int SeqList〈datatype〉::Locate(datatype item)
{
for (int i=0; i〈length; i++)
if (data[i]==item)
return i+1 ;
//下标为i的元素等于ite 32、m,返回其序号i+1
return 0; //查找失败
}
(9)获得顺序线性表第i个元素的值
/*
*输 入:查询元素位置i
*前置条件:顺序表存在,i要合法
*功 能:按位查找位置为i的元素并输出值
*输 出:查询元素的值
*后置条件:无
*/
实现代码:
template 〈class datatype>
datatype SeqList 33、1];
}
(10)判表空算法
/*
*输 入:无
*前置条件:无
*功 能:判表是否为空
*输 出:为空返回1,不为空返回0
*后置条件:无
*/
实现代码:
template 〈class datatype>
bool SeqList〈datatype〉::Empty()
{
if (length==0)
{
return 1;
}
else
{
return 0;
}
}
(11)求直接前驱结点算法
/*
*输 入:要查找的元素e,待存放前驱结点值e1
*前置条件:无
*功 能: 34、查找该元素的所在位置,获得其前驱所在位置.
*输 出:返回其前驱结点的位序。
*后置条件:e1值为前驱结点的值
*/
实现代码:
template 35、条件:无
*功 能:查找该元素的所在位置,获得其后继所在位置.
*输 出:返回其后继结点的位序。
*后置条件:e1值为后继结点的值
*/
实现代码:
template〈class datatype>
int SeqList〈datatype>::Suc(datatype item)
{
int k=Locate(item)+1;
if (k〉length)
{
cout〈〈”无后继结点!”〈 36、
用以上基本操作算法,实现A=AUB算法。(利用函数模板实现)
/*
*输 入:集合A,集合B
*前置条件:无
*功 能:实现A=AUB
*输 出:无
*后置条件:A中添加了B中的元素。
*/
实现代码:
template〈class datatype>
SeqList〈datatype〉 SeqList 37、this->Length();
for (int i=1;i<=k;i++)
{
for(int j=0;j 38、<<"A∪B的结果是:”〈 39、void SeqList 40、k>i;k-—)
data[k]=data[k—1];
data[i]=item;
length++;
break;
}
}
}
void main()
{
SeqList 41、Insert(2);
A。orderInsert(4); //插入元素
cout〈<”插入新元素后的顺序表为:"< 42、emplate〈class datatype>
SeqList 43、4);
La.Insert(3,6);
La。Insert(4,8); //插入La
cout<〈"La中元素为:”〈〈endl;
La。display(); //输出La
cout<〈endl;
Lb.Insert(1,3);
Lb。Insert(2,6);
Lb。Insert(3,8); //插入Lb
cout〈<”Lb中元素为:"〈〈endl;
Lb.display(); //输出Lb
cout〈〈endl;
Lc=Lc.ElseAdd(La,Lb); //合并两线性表
cout<〈”合并后的Lc为:"〈






