第二章 线性表—单链表
数据结构基础代码 (严蔚敏 人邮教育出版社)
头文件
在写程序前,先插入一个简单的关于头文件的介绍,那么什么是头文件呢?
头文件,其实就是在运用C语言建立代码时,包含许多编译器已经写好的函数的文件,可以方便在程序编写时直接使用。
例如:#include <stdio.h>中就包含了我们在写C语言代码时经常使用的printf和scanf函数,当然C++中就变成了#include < iostream >。
关于C语言不同类型头文件包含的不同函数,小白选手是可以参阅一下这个链接,这个会对那些不太清楚编写代码时不知道写什么头文件的小白鞋们提供帮助~~点这里
链表的创建:
1、带头结点链表的创建(头插法建立)
#include <stdlib.h> //free函数会用到。
#include <iostream> // C++的输入cin和输出cout
using namespace std;
//单链表结点的定义
typedef struct LNode
{
int data;
struct LNode *next;//指向后继节点的指针
} LNode,*LinkList;
//链表的建立头插法
void ListInsert (LinkList &L,int n)
{
LNode *p;
L=new LNode; //生成新结点作为头结点,用头指针L指向头结点。
L->next=NULL; //头结点指针域置空。
int i;
cout <<"【头插法】请输入链表中的元素:"<< endl;
for(i=0;i<n;i++)
{
p=new LNode;
cin >> p->data;
p->next=L->next;
L->next=p;
}
}
void Print(LinkList L)
{
LNode *p;
p=L->next;
cout << "您所创建的链表如下:" <<endl;
while(p)
{
cout<< p->data <<" " ;
p=p->next;
}
cout << endl;
}
int main()
{
int n;
LinkList L;
cout <<"请输入链表中元素个数:"<<endl;
cin >> n;
ListInsert(L,n);
Print(L);
return 0;
}
运行结果如下:
头插法图示:
2、带头结点链表的创建(尾插法建立)
#include <stdlib.h> //free函数会用到。
#include <iostream> // C++的输入cin和输出cout
using namespace std;
//单链表结点的定义
typedef struct LNode
{
int data;
struct LNode *next;//指向后继节点的指针
} LNode,*LinkList;
void ListInsert2 (LinkList &L,int n)
{
LNode *p,*q; //这里我们需要多建立一个指针帮助我们
L= new LNode; //为头结点开辟新的空间。
L->next=NULL;
q=L;
int i;
cout <<"【尾插法】请输入链表中的元素:"<< endl;
for(i=0;i<n;i++)
{
p=new LNode;
cin >> p->data;
p->next=NULL;//这步不写就会出现指针乱指的现象
q->next=p;
q=p;
}
}
void Print(LinkList L)
{
LNode *p;
p=L->next;
cout << "您所创建的链表如下:" <<endl;
while(p)
{
cout<< p->data <<" " ;
p=p->next;
}
cout << endl;
}
int main()
{
int n;
LinkList L;
cout <<"请输入链表中元素个数:"<<endl;
cin >> n;
ListInsert2(L,n);
Print(L);
return 0;
}
运行结果如下
尾插法图示
3、无头结点单链表头插法建立单链表
#include <stdlib.h> //free函数会用到。
#include <iostream> // C++的输入cin和输出cout
using namespace std;
//单链表结点的定义
typedef struct LNode
{
int data;
struct LNode *next;//指向后继节点的指针
} LNode,*LinkList;
void ListInsert (LinkList &L,int n)
{
LNode *p;
L->next=NULL;
int i;
cout << "[无头结点头插法]请输入链表元素值"<<endl;
for(i=0;i<n;i++)
{
p=new LNode;
cin >> L->data; //这个位置就是与有头结点的差异,先给L指针指向的位置传值
p->next=L;
L = p;
}
}
void Print(LinkList L)
{
LNode *p;
p=L->next;
cout << "您所创建的链表如下:" <<endl;
while(p)
{
cout<< p->data <<" " ;
p=p->next;
}
cout << endl;
}
int main()
{
int n;
LinkList L;
cout <<"请输入链表中元素个数:"<<endl;
cin >> n;
ListInsert(L,n);
Print(L);
return 0;
}
4、无头结点单链表尾插法的创建
#include <stdlib.h> //free函数会用到。
#include <iostream> // C++的输入cin和输出cout
using namespace std;
//单链表结点的定义
typedef struct LNode
{
int data;
struct LNode *next;//指向后继节点的指针
} LNode,*LinkList;
void ListInsert2 (LinkList &L,int n)
{
LNode *p,*q; //这里我们需要多建立一个指针帮助我们
L->next=NULL;
q=L;
int i;
cout <<"【无头结点单链表尾插法】请输入链表中的元素:"<< endl;
for(i=0;i<n;i++)
{
p=new LNode;
cin >> p->data;
if(L==NULL) //如果L结点是空的,那么先让L指向p所指向结点。(这是与带头结点的区别)
{
L=p;
q=p;
continue;
}
q->next=p; //之后还与以前一样了,用q来记录链表尾部,p指向新增结点。
q=p;
}
}
void Print(LinkList L)
{
LNode *p;
p=L->next;
cout << "您所创建的链表如下:" <<endl;
while(p)
{
cout<< p->data <<" " ;
p=p->next;
}
cout << endl;
}
int main()
{
int n;
LinkList L;
cout <<"请输入链表中元素个数:"<<endl;
cin >> n;
ListInsert2(L,n);
Print(L);
return 0;
}
运行结果如下: