数据结构之线性链表的算法
2006-04-17 18:33
471 查看
信息来源:http://blog.csdn.net/heroooooo
文章作者:heroooooo
#include "iostream.h"
#include "malloc.h"
//这个只是一个小小的头文件
//这些都是用链表表示的线性链表 的一些最为常见的一些函数
//这些函数做得最不好的一个地方就是没有将线性表的长度存放在链表的头节点
#define ERROR 0
#define OK 1
#define NULL 0
typedef int ElemType ;
typedef int status;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
status initlist(LinkList &L)
{
L=(LinkList)malloc(sizeof(LNode));
return 0;
}
status getitem(LinkList L,int i,ElemType &e)
{//此函数的功能是将一个线性链表的第i个元素取出来.并将它的值用e返回
LinkList q=0;
q=L->next;
int j=1;
while(q&&j<i)
{
q=q->next;j++;
}
if((!q)||j>i)
return ERROR;
e=q->data;
return OK;
}
status creatlist(LinkList &L,int n)
{//次函数的功能是逆向建立一个长度为n的线性链表
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;L->data=0;
LinkList q=0;
int i=0;
cout<<"please input "<<n<<" number:";
for(i=1;i<=n;i++)
{q=(LinkList)malloc(sizeof(LNode));
cin>>(q->data);
q->next=L->next;
L->next=q;
L->data++;}
return OK;
}
status Creatlist(LinkList &L,int n)
{//次函数的功能是按照顺序的方式建立一个线性链表
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;L->data=0;
LinkList p,q;
p=q=L;
int i=0;
for(i=0;i<=n;i++)
{
p=(LinkList)malloc(sizeof(LNode));
cin>>p->data;
p->next=NULL;
q->next=p;q=p;
L->data++;
}
return OK;
}
status push(LinkList &L,ElemType e)
{//将一个元素推带堆栈中
if(L==NULL)
{L=(LinkList)malloc(sizeof(LNode));
L->data=0;}
LinkList q=0;
q=(LinkList)malloc(sizeof(LNode));
q->data=e;
q->next=L->next;
L->next=q;
L->data++;
return OK;
}
status pull(LinkList &L,ElemType &e)
{//这个函数的功能是将一个线性表拉出来一个元素,并且用e返回,在开始的时候还可以对文件
//判断一下
if((L==NULL)||(L->next==NULL))
return ERROR;
LinkList q;
q=L->next;
e=q->data;
L->next=q->next;
free(q);//最后别忘了将指针释放掉
return OK;
}
int lengthlist(LinkList L)
{//求线性链表的长度,并且用cout的值返回
int cout=0;
LinkList q=0;
q=L->next;
while(q)
{
cout++;
q=q->next;
}
return cout;
}
status coutlist(LinkList L)
{//依次将我们的线性链表打印出来
LinkList q=0;
q=L->next;
cout<<"the list number is"<<endl;
while(q)
{
cout<<(q->data)<<" ";
q=q->next;
}
return OK;
}
status getiteme(LinkList L,LinkList &q,ElemType e)
{//次函数的功能是在一个已经
//存在的链表中找到一个已知的数据的第一个位置,次函数的功能是将这个
//数的位置用一个指针q表示出来.
LinkList p=0;
p=L->next;
while(p&&(p->data)!=e)
{
p=p->next;
}
if(p&&(p->data==e))
{q=p;
return OK;}
else
{q=NULL;
return ERROR;
}
}
//函数是基本上做完了,现在只要将循环链表和双向链表做好了,就行了!!
文章作者:heroooooo
#include "iostream.h"
#include "malloc.h"
//这个只是一个小小的头文件
//这些都是用链表表示的线性链表 的一些最为常见的一些函数
//这些函数做得最不好的一个地方就是没有将线性表的长度存放在链表的头节点
#define ERROR 0
#define OK 1
#define NULL 0
typedef int ElemType ;
typedef int status;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
status initlist(LinkList &L)
{
L=(LinkList)malloc(sizeof(LNode));
return 0;
}
status getitem(LinkList L,int i,ElemType &e)
{//此函数的功能是将一个线性链表的第i个元素取出来.并将它的值用e返回
LinkList q=0;
q=L->next;
int j=1;
while(q&&j<i)
{
q=q->next;j++;
}
if((!q)||j>i)
return ERROR;
e=q->data;
return OK;
}
status creatlist(LinkList &L,int n)
{//次函数的功能是逆向建立一个长度为n的线性链表
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;L->data=0;
LinkList q=0;
int i=0;
cout<<"please input "<<n<<" number:";
for(i=1;i<=n;i++)
{q=(LinkList)malloc(sizeof(LNode));
cin>>(q->data);
q->next=L->next;
L->next=q;
L->data++;}
return OK;
}
status Creatlist(LinkList &L,int n)
{//次函数的功能是按照顺序的方式建立一个线性链表
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;L->data=0;
LinkList p,q;
p=q=L;
int i=0;
for(i=0;i<=n;i++)
{
p=(LinkList)malloc(sizeof(LNode));
cin>>p->data;
p->next=NULL;
q->next=p;q=p;
L->data++;
}
return OK;
}
status push(LinkList &L,ElemType e)
{//将一个元素推带堆栈中
if(L==NULL)
{L=(LinkList)malloc(sizeof(LNode));
L->data=0;}
LinkList q=0;
q=(LinkList)malloc(sizeof(LNode));
q->data=e;
q->next=L->next;
L->next=q;
L->data++;
return OK;
}
status pull(LinkList &L,ElemType &e)
{//这个函数的功能是将一个线性表拉出来一个元素,并且用e返回,在开始的时候还可以对文件
//判断一下
if((L==NULL)||(L->next==NULL))
return ERROR;
LinkList q;
q=L->next;
e=q->data;
L->next=q->next;
free(q);//最后别忘了将指针释放掉
return OK;
}
int lengthlist(LinkList L)
{//求线性链表的长度,并且用cout的值返回
int cout=0;
LinkList q=0;
q=L->next;
while(q)
{
cout++;
q=q->next;
}
return cout;
}
status coutlist(LinkList L)
{//依次将我们的线性链表打印出来
LinkList q=0;
q=L->next;
cout<<"the list number is"<<endl;
while(q)
{
cout<<(q->data)<<" ";
q=q->next;
}
return OK;
}
status getiteme(LinkList L,LinkList &q,ElemType e)
{//次函数的功能是在一个已经
//存在的链表中找到一个已知的数据的第一个位置,次函数的功能是将这个
//数的位置用一个指针q表示出来.
LinkList p=0;
p=L->next;
while(p&&(p->data)!=e)
{
p=p->next;
}
if(p&&(p->data==e))
{q=p;
return OK;}
else
{q=NULL;
return ERROR;
}
}
//函数是基本上做完了,现在只要将循环链表和双向链表做好了,就行了!!
相关文章推荐
- 【算法和数据结构】_6_线性结构_双链表
- 【数据结构】算法2.8-2.122 线性表的单链表
- 数据结构习题分析:已知由一个线性链表表示的线性表中含有三类字符的数据元素,是编写算法将该线性表分割为三个循环链表,其中每个。。。。。
- 数据结构学习笔记 --- 线性表 (一些常见的关于链表的算法和面试题)
- 数据结构【线性表(二)链表】项目之自建算法库—单链表
- 线性表12|循环链表 – 数据结构和算法17
- 数据结构学习笔记 --- 线性表 (一些常见的关于链表的算法和面试题)
- 09-数据结构_线性结构-离散存储-链表_插删伪算法
- 算法与数据结构--实现线性表的合并操作(合并后按非递减排列)
- C# 数据结构 线性表(顺序表 链表 IList 数组)
- 数据结构之线性表链式存储(链表)
- PHP数据结构与算法:单向循环链表
- Leetcode---线性数据结构(栈,链表,队列)的
- 链表_第10章_基本数据结构_算法导论
- 数据结构整理_线性表之链表
- 转:链表相交有环 经典面试题(三)附答案 算法+数据结构+代码 微软Microsoft、谷歌Google、百度、腾讯
- 02-线性结构1 两个有序链表序列的合并——中国大学MOOC-陈越、何钦铭-数据结构-2017秋
- 数据结构之线性结构--双向循环链表
- 算法与数据结构面试题(11)-一次遍历得到链表的中间节点
- 算法与数据结构 其二 数组和链表 的实现