实验目的:
理解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。
实验内容:
(1)顺序表的操作
① 随机产生一组两位数整数,建立线性表的顺序存储结构。
② 实现该线性表的遍历。
③ 在该顺序表中查找某一元素,查找成功显示查找元素,否则显示查找失败。
④ 在该顺序表中删除或插入指定元素。
(2)单链表的操作
① 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。
② 实现该线性表的遍历。
③ 实现单链表的就地逆置。
④ 建立两个按值递增有序的单链表,将他们合并成一个按值递减有序的单链表。要求利用原来的存储空间,并且新表中没有相同的元素。
实验一:顺序表操作代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ListInitSize 100
#define ListIncerment 10
typedef struct
{
int *base;
int length;
int listsize;
}SqList;
//初始化操作
void InitSqList(SqList &L)
{
L.base = (int*)malloc(ListInitSize*sizeof(int));
if(!L.base){
cout << "分配失败";
return ;
}
L.length = 0;
L.listsize = ListInitSize;
}
//查找元素
bool chazhao(SqList L,int e)
{
if(L.length == 0)
return 0;
for(int i = 0;i < L.length;i++){
if(L.base[i] == e)
return 1;
}
return 0;
}
void deleteElem(SqList &L,int e)
{
for(int i = 0;i <L.length;i++){
if(L.base[i] == e){
for(int j = i;j < L.length-1;j++){
L.base[j] = L.base[j+1];
}
L.length--;
i--;
}
}
}
int main()
{
SqList L;
InitSqList(L);
int n = 20;
for(int i = 0;i < n;i++){
L.base[i] = rand() % 90 + 10;
L.length++;
}
//线性表的遍历
for(int i = 0;i < L.length;i++){
cout << L.base[i] << " ";
}
cout << endl;
//查找某一元素
cout << "请输入想要查询的元素:";
int e;
cin >> e;
if(chazhao(L,e))
cout << e << endl;
else
cout << "查找失败" << endl;
cout << "请输入想要删除的元素:";
cin >> e;
deleteElem(L,e);
for(int i = 0;i < L.length;i++){
cout << L.base[i] << " ";
}
cout << endl;
cout << "请输入想要插入的元素:";
cin >> e;
L.base[L.length++]=e;
for(int i = 0;i < L.length;i++){
cout << L.base[i] << " ";
}
}
实验二链表操作代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
//单链表的初始化
void InitLinkList(LinkList &L)
{
L = (LinkList)malloc(sizeof(LNode));
if(!L)
return;
L -> next = NULL;
}
//尾插法
void Create(LinkList &L,int n)
{
L = (LinkList)malloc(sizeof(LNode));
L -> next = NULL;
LNode *p;
for(int i = 0;i < n;i++){
p = (LNode *)malloc(sizeof(LNode));
cin >> p -> data;
// cout << p -> date /*<< "jinlai" << endl*/;
p -> next = L -> next;
L -> next = p;
}
}
//遍历
void out(LinkList L)
{
LNode *p = L;
p=p->next;
while(p){
cout << p -> data << " ";
p = p->next;
}
cout << endl;
}
LNode* reverseList(LNode* list){
//将头节点与链表断开 first为待插入链表的第一个节点
LNode* first = list->next;
list->next = NULL;
//将断开的链表使用头插法插入到头节点后 work为待插入节点
while (first != NULL)
{
LNode* work = first;
first = work->next;
//将work插入
work->next = list->next;
list->next = work;
}
//返回头节点
return list;
}
void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc)
{
LNode *pa;
LNode *pb;
LNode *t;
Lc = t = La;
pa = La -> next;
pb = Lb -> next;
while(pa && pb)
{
if(pa -> data >= pb -> data){
t -> next = pa;
t = pa;
pa = pa -> next;
}
else
{
t -> next = pb;
t = pb;
pb = pb -> next;
}
}
if(pa)
t -> next = pa;
else
t -> next = pb;
free(Lb);
}
int main()
{
LinkList L;
InitLinkList(L);
cout << "请输入元素的个数:";
int n;
cin >> n;
Create(L,n);
out(L);
L = reverseList(L);
out(L);
cout << "请输入两个升序链表的元素:";
int a,b;
cin >> a >> b;
LinkList L1,L2;
InitLinkList(L1);
InitLinkList(L2);
cout << "请输入第一个升序链表中的元素" << endl;
Create(L1,a);
cout << "请输入第二个升序链表中的元素" << endl;
Create(L2,b);
MergeList(L1,L2,L1);
out(L1);
}