链式线性表的实现

可学习的链接:http://zhaoyuqiang.blog.51cto.com/6328846/1165492

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
using namespace std;
//#include<algorithm>
//using namespace std;

#define ERROR 0
#define OK 1
#define overflow -2
#define MAXSIZE 1000

typedef int ElemType;
typedef int Status;

// - - - - - - 线性表的单链表存储结构 - - - - - -

typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode, *LinkList;

/*Status GreateList_L( LinkList &L,int n )
{
// 逆位序输入n个元素的值,建立带表头结点的单链线性表L。
int i;
LinkList p;
L = (LinkList)malloc( sizeof(LNode) );
L->next = NULL; //先建立一个带头结点的单链表。
for(i=n;i>0;--i)
{ p = (LinkList)malloc( sizeof(LNode) ); //生成新结点。
scanf("%d",&p->data); //插入元素值。
p->next = L->next;
L->next = p; //插入到表头。
}
return OK;
}*/

Status GreateList_L( LinkList &L,int n)
{ // 顺序存储n个元素的值,建立带头结点的单链表线性表L。
int i;
LinkList p,r;
L = (LinkList)malloc(sizeof(LNode));// 给头结点申请存储空间。
L->next = NULL;
r=L;
for(i=0;i<n;i++)
{
p = (LinkList)malloc(sizeof(LNode));//生成新结点。
scanf("%d",&p->data); // 插入元素的值。
p->next = NULL;
r->next = p;
r = r->next = p; //即把r指针移动到新开辟的新结点上。
}
return OK;
}

Status GetElem_L( LinkList L,int i,ElemType &e)
{
// L为带头结点的单链表的头指针。
// 当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR。
int j;
LinkList p;
p = L->next; j = 1; //初始化,p指向第一个结点,j为计数器。
while( p && j < i ) //顺指针向后查找,直到p为指向的第i个元素或p为空。
{
p = p->next; ++j;
}
if( !p || j>i ) return ERROR; //第i个元素不存在。
e = p->data; //取第i个元素。
return OK;
}

Status ListInsert_L(LinkList &L,int i,ElemType e)
{
//在带头结点的单链线性表L中第i个位置之前插入元素e。
int j;
LinkList p,s;
p = L; j = 0;
while (p && j<i-1 )
{ p = p->next; ++j; } // 寻找第i-1个结点。
if( !p || j>i-1 ) return ERROR; //i小于1或者大于表长+1。
s = ( LinkList ) malloc ( sizeof (LNode) ); //生成新结点。
s->data = e; s->next = p->next; // 插入L中。
p->next = s;
return OK;
}

Status ListDelete_L( LinkList &L,int i,ElemType &e )
{
// 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值。
int j;
LinkList p,q;
p = L ; j = 0;
while( p->next && j<i-1 )
{
//寻找第i个结点,并令p指向其前驱。
p = p->next; ++j;
}
if( !( p->next )|| j>i-1 ) return ERROR; //删除位置不合理。
q = p->next; p->next = q->next; //删除并释放结点。
e = q->data;
free(q);
return OK;
}

void MergeList_L(LinkList &La, LinkList &Lb, LinkList &Lc)
{
// 已知单链线性表La和Lb的元素按值非递减排列。
// 归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列。
LinkList pa,pb,pc;
pa = La->next ; pb = Lb->next;
Lc = pc = La; // 用La的头结点作为Lc的头结点。

while(pa&&pb)
{
if( pa->data <= pb->data )
{
pc->next = pa;
pc = pa;
pa = pa->next;
}
else
{
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
pc->next = pa?pa:pb; // 插入剩余段。
free(Lb); // 释放Lb的头结点。
}


int main()
{
LinkList La,Lb,Lc;
ElemType elem1,elem2,elem3,elem4;
int n,m,i;
cout<<"输入链表La和Lb的长度n和m: ";
cin>>n>>m;
cout<<endl;

cout<<"输入链表La中的n个元素的值: "<<endl;
GreateList_L(La,n);

cout<<"输入链表Lb中的m个元素的值: "<<endl;
GreateList_L(Lb,m);

cout<<"查找链表La中第3个元素: ";
GetElem_L(La,3,elem1);
cout<<elem1<<endl<<endl;

cout<<"链表La删除了第2个元素后的元素: ";
ListDelete_L(La,2,elem2);
for(i=1;i<n;i++)
{
GetElem_L(La,i,elem3);
cout<<elem3<<" ";
}
cout<<endl<<endl;

cout<<"在链表La的第3个位置插入元素100后: ";
ListInsert_L(La,3,100);
for(i=1;i<=n;i++)
{
GetElem_L(La,i,elem3);
cout<<elem3<<" ";
}
cout<<endl<<endl;
MergeList_L(La,Lb,Lc);
for(i=1;i<=n+m;i++)
{
GetElem_L(La,i,elem4);
cout<<elem4<<" ";
}
cout<<endl<<endl;
system("pause");
return 0;
}

posted @ 2015-08-04 09:21  Vmetrio  阅读(227)  评论(0编辑  收藏  举报