初学数据结构和算法,使用的c++语言。
单链表的实现,主要是在尾指针那块卡了一下下,尾指针的操作还是要仔细,否则指向不明内存,引发程序崩溃。
希望对初学者有点用,主要还是自己加深印象。
//单链表
#include <iostream>
#include <MATH.H>
#define OK 1
#define ERROR -1
using namespace std;
//链表存储结构
typedef struct node
{
int data; //数据域
struct node* p_next; //指针域
}node,*Linklist;
Linklist p_head; //头指针
//初始化链表
void InitList(Linklist & L)
{
L = new node;
if(!L)
exit(OVERFLOW);
L->p_next =NULL;
}
//链表长度
int Linklistlen(Linklist L)
{
node * p = L->p_next;
int len = 0;
while(p!=NULL)
{
len++;
p = p->p_next;
}
return len;
}
//按序号查找
node* InSearch_Pos(Linklist L,int pos) //传入要查在的位置序号
{
node * p =L->p_next;
int count = 1;
while(p!=NULL && count<pos)
{
count++;
p = p->p_next;
}
if( pos == count)
return p;
else
return NULL;
}
//按值查找
node* InSearch_Data(Linklist L,int data) //传入要查找的值
{
node * p ;
p = L->p_next;
while(p!=NULL&&p->data!=data)
p = p->p_next;
if(p!=NULL&&p->data == data)
return p;
else
return NULL;
}
//插入操作
int LinkInsert(Linklist & L, int data, int pos) //插入数据到链表的指定位置
{
node * p , * s;
p = InSearch_Pos(L,pos-1); //找到要插入位置的前一个位置
if(p==NULL)
return ERROR;
s = new node;
if(s == NULL)
return ERROR;
s->data = data;
s->p_next = p->p_next; //插入新节点,注意顺序,小心链表断掉
p->p_next = s;
return OK;
}
//删除操作
int LinkDelete(Linklist & L, int pos)
{
node * p = InSearch_Pos(L,pos-1);
if(p==NULL)
return ERROR;
node * q = p->p_next;
p->p_next = q->p_next;
delete q;
q = NULL; //防止内存泄漏
return OK;
}
//销毁链表
void LinkDestroy(Linklist & L)
{
node * p;
while(L->p_next!=NULL)
{
p = L->p_next;
L->p_next = p->p_next;
delete p;
p = NULL;
}
}
//显示链表
void LinkShow(Linklist L)
{
node * p ;
// while(p!=NULL)
// {
// cout<<p->data<<" ";
// p = p->p_next;
// }
for(p = L->p_next; p!=NULL ;p =p->p_next)
cout<<p->data <<" ";
cout <<endl;
}
//头插法
void Add_head(Linklist &L,int data)
{
node * p;
p = new node;
p->data = data;
p->p_next = L->p_next;
L->p_next = p;
}
//尾插法
void Add_tail(Linklist &L, int data) //每次输入一个数据,传入
{
node * p , * r;
r = L;
p = new node;
p->data = data;
p->p_next = NULL;
while(r->p_next) //循环找到链表尾部
r= r->p_next;
r->p_next = p;
}
// void Add_tail(Linklist &L, int n) //每次输入n个数据,键盘输入
// {
// node * p, * r;
// r = L;
// for(int i = 0; i<n ; i++)
// {
// p = new node;
// cout << "请输入数据:";
// cin >> p->data;
// p->p_next = NULL;
// r->p_next = p;
// r = p; //尾指针指向链表尾端
// }
// }
int main()
{
cout << "\t - - - - - -测试 - - - - - -"<< endl;
InitList(p_head);
cout << "采用头插法为空表添加5个值."<<endl;
Add_head(p_head,1);
Add_head(p_head,2);
Add_head(p_head,3);
Add_head(p_head,4);
Add_head(p_head,5);
cout <<"插入前链表为:"<<endl;;
LinkShow(p_head);
cout <<"在第二个位置和第四个位置插入两个数据10和11:" <<endl;
LinkInsert(p_head,10,2);
LinkInsert(p_head,11,4);
LinkShow(p_head);
cout << "此时链表的长度为:";
cout << Linklistlen(p_head)<<endl;
cout <<"- - - - - - - - - - - - - - - - - - - -"<<endl;
cout << "采用尾插法为已有链表增加两个值6和7:"<<endl;
Add_tail(p_head,6);
Add_tail(p_head,7);
LinkShow(p_head);
cout << "此时链表的长度为:";
cout << Linklistlen(p_head)<<endl;
return 0;
}