单链表操作
一、实验目的:
熟悉单链表的定义,单链表的建立方法及相关基本操作,理解单链表的基本
思想,能够根据实际情况选择合适的存储结构。
二、实验要求:
算法完善,考虑时间复杂度。
三、实验内容:
1、利用头插法或尾插法建立单链表;
2、对已建立的单链表实现插入、删除等基本操作;
3、输出链表所有结点数据;
4、编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表并计算表长,要求利用原来两个单链表的结点存放归并后的单链表。
目录
定义单链表
typedef struct LNode{
int data;
LNode * next;
}LNode,*LinkList;
尾插法建立单链表
void CreateList_R(LinkList &L){
LNode *r = L;
int n;
cout<<"创建单链表的结点数:";
cin>>n;
for (int i = 0; i < n; i++) {
LNode *p = new LNode;
cout<<"请输入第"<<i+1<<"个结点的数据:";
cin >> p->data;
p->next = NULL;
r->next = p;
r = p;
}
}
单链表的插入
void ListInsert(LinkList &L) {
LNode* p;
p = L;
int i,e,j = 0;
cout<<"输入要插入的位置;" ;
cin>>i;
cout<<"输入要插入的数据:";
cin>>e;
while (p && (j < i - 1)) {
p = p->next;
++j;
}
if (!p || j > i - 1)
cout << "ERROR!" << endl;
LNode* s = new LNode;
s->data = e;
s->next = p->next;
p->next = s;
PrintList(L);
}
单链表的删除
void ListDelete(LinkList & L) {
LNode* p;
p = L;
int i,j = 0;
cout<<"输入要删除的位置:";
cin>>i;
while ((p->next) && (j < i - 1)) {
p = p->next;
++j;
}
if (!(p->next) || (j > i - 1))
cout << "ERROR!" << endl;
LNode* q = new LNode;
q = p->next;
p->next = q->next;
delete q;
PrintList(L);
}
获取单链表的长度
int LinkListLength(LinkList L){
LNode* p=L->next;
int j=1;
while(p->next){
p=p->next;
j++;
}
return j;
}
单链表的排序
void sort(LinkList & L1,LinkList & L2,int m){
LNode* p=L1->next;
while(p->next)
p=p->next;
p->next=L2->next;
cout<<"合并后";
PrintList(L1);
p=L1->next;
int t,i,j;
for(i=1;i<=m-1;i++){
for(j=1;j<=m-i;j++){
if(p->data<p->next->data){
t=p->data;p->data=p->next->data;p->next->data=t;
}
p=p->next;
}
p=L1->next;
}
cout<<"排序后";
PrintList(L1);
cout<<"链表的长度为:"<<LinkListLength(L1)<<endl;
}
全代码
#include <iostream>
using namespace std;
//定义单链表
typedef struct LNode{
int data;
LNode * next;
}LNode,*LinkList;
尾插法建立单链表
void CreateList_R(LinkList &L){
LNode *r = L;
int n;
cout<<"创建单链表的结点数:";
cin>>n;
for (int i = 0; i < n; i++) {
LNode *p = new LNode;
cout<<"请输入第"<<i+1<<"个结点的数据:";
cin >> p->data;
p->next = NULL;
r->next = p;
r = p;
}
}
// 输出所有链表结点数据
void PrintList(LinkList L) {
LNode* p;
p = L->next;
cout << "你创建的单链表为;";
cout<<" ";
while (p) {
cout <<p->data << " ";
p=p->next;
}
cout<<endl<<endl;
}
//单链表的插入
void ListInsert(LinkList &L) {
LNode* p;
p = L;
int i,e,j = 0;
cout<<"输入要插入的位置;" ;
cin>>i;
cout<<"输入要插入的数据:";
cin>>e;
while (p && (j < i - 1)) {
p = p->next;
++j;
}
if (!p || j > i - 1)
cout << "ERROR!" << endl;
LNode* s = new LNode;
s->data = e;
s->next = p->next;
p->next = s;
PrintList(L);
}
//单链表的删除
void ListDelete(LinkList & L) {
LNode* p;
p = L;
int i,j = 0;
cout<<"输入要删除的位置:";
cin>>i;
while ((p->next) && (j < i - 1)) {
p = p->next;
++j;
}
if (!(p->next) || (j > i - 1))
cout << "ERROR!" << endl;
LNode* q = new LNode;
q = p->next;
p->next = q->next;
delete q;
PrintList(L);
}
//获取单链表的长度
int LinkListLength(LinkList L){
LNode* p=L->next;
int j=1;
while(p->next){
p=p->next;
j++;
}
return j;
}
//单链表的排序
void sort(LinkList & L1,LinkList & L2,int m){
LNode* p=L1->next;
while(p->next)
p=p->next;
p->next=L2->next;
cout<<"合并后";
PrintList(L1);
p=L1->next;
int t,i,j;
for(i=1;i<=m-1;i++){
for(j=1;j<=m-i;j++){
if(p->data<p->next->data){
t=p->data;p->data=p->next->data;p->next->data=t;
}
p=p->next;
}
p=L1->next;
}
cout<<"排序后";
PrintList(L1);
cout<<"链表的长度为:"<<LinkListLength(L1)<<endl;
}
int main()
{
LNode * L1 = new LNode;
L1->next = NULL;
CreateList_R(L1);
PrintList(L1);
ListInsert(L1);
ListDelete(L1);
LNode * L2 = new LNode;
L2->next = NULL;
CreateList_R(L2);
PrintList(L2);
int m=LinkListLength(L1)+LinkListLength(L2);
sort(L1,L2,m);
return 0;
}
运行结果