学习笔记------数据结构(C语言版) 线性表链式存储

//Function realization.cpp

#include "predefined.h"
#include"lianshijiegou.h"
//----线性表的动态分配链式存储结构函数实现---------
Status InitList_L(LinkList *L)//构造一个带头结点的空线性表
{
	(*L)=(LinkList)malloc(sizeof(LNode));
	if(!L) exit(OVERFLOW);
	(**L).next=NULL;
	(**L).data=0;
	return OK;
}
Status DestroyList_L(LinkList *L)//销毁线性表
{
	LinkList p,q;
	p=*L;
	while(p)
	{
		p=(**L).next;
		free(*L);
		(*L)=p;
	}
	return OK;
}
Status ClearList_L(LinkList *L)//重置线性表为空表,保留头结点
{
	LinkList p,q;
	p=*L;
	if(!p) return FALSE; 
	p=(*p).next;
	while(!p)
	{
		q=p;
		p=(*p).next;
		free(q);
	}
	(**L).next=NULL;
	return OK;
}
Status ListEmpty_L(LinkList L)//若为空表,返回TRUE,否则返回FALSE
{
	if(!((*L).next)&&L!=NULL) return TRUE;
	else return FALSE;
}
Status ListLength_L(LinkList L)//返回表中数据个数
{
	ElemType n=0;
	LinkList p;
	p=L;
	while(p=(*p).next) n++;
	return n;
}
Status GetElem_L(LinkList L,int i,ElemType *e)//L为带头结点的单链表的头指针。
//算法2.8:当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR。
{
	LinkList p;
    int j=1;
	p=(*L).next;
	while(p&&j<i)
	{
		p=(*p).next;
		++j;
	}
	if(!p||j>i) return ERROR;
   *e=(*p).data;
   return OK;
}
Status LocateElem_L(LinkList L,ElemType e,Status (*compare)(LinkList L,ElemType e))
//返回L中第一个与e满足关系compare数据元素的位序。若这样的数据元素不存在,则返回0。
{
	LinkList p;
	p=(*L).next;
	Status n;
	n=compare(p,e);
	if(n) return n;
	else return FALSE;
}
Status PriorElem_L(LinkList L,ElemType cur_e,ElemType *pre_e)
//若cur_e是L的数据元素,且不是第一个,则用e返回它的前驱,否则操作失败
{
	LinkList p=(*L).next;
	Status n;
	n=LocateElem_L(L,cur_e,equal);
	if(n==1||n==0) return FALSE;
	for(int i=2;i<n;i++)
	{
		p=(*p).next;
	}
	*pre_e=(*p).data;
	return OK;
}
Status NextElem_L(LinkList L,ElemType cur_e,ElemType *next_e)
//若cur_e是L的数据元素,且不是最后一个,则用e返回它的后继,否则操作失败
{
	LinkList p=(*L).next;
	while((*p).next!=NULL)
	{
		if((*p).data==cur_e) 
			{
				*next_e=(*(*p).next).data;
				return OK;
		    }
		else p=(*p).next;
	}
	return FALSE;
}
Status ListInsert_L(LinkList *L,int i,ElemType e)
//算法2.9:在带头结点的单链表L中第i个位置之前插入元素e。
{
	LinkList p,q;
	p=*L;
	if(i<1||i>ListLength_L(*L)+1) return FALSE;
	for(int j=1;j<i;j++)
	{
		p=(*p).next;
	}
	q=(LinkList)malloc(sizeof(LNode));
	(*q).data=e;
	(*q).next=(*p).next;
	(*p).next=q;
	return OK;
}
Status ListDelete_L(LinkList *L,int i,ElemType *e)
//算法2.10:在带头结点的单链线性表L中,删除第i个元素,并由e返回其值。
{
	LinkList p,q;
	p=*L;
	for(int j=1;j<i;j++)
	{
		p=(*p).next;
	}
	*e=(*(*p).next).data;
	q=(*p).next;
	(*p).next=(*(*p).next).next;
	free(q);
	return OK;
}
Status ListTraverse_L(LinkList L,Status (*visit)(LinkList L))
//依次对L中每个元素调用visit函数。
{
	LinkList p;
	Status m;
	p=(*L).next;
	while(p!=NULL)
	{
		m=visit(p);
		if(m) p=(*p).next;
		else return FALSE;
	}
	return OK;
}
void CreatList_L(LinkList *L,int n)
//算法2.11逆位序输入n个元素的值,建立带头结点的单链表L。
{
	(*L)=(LinkList)malloc(sizeof(LNode));
	if(!L) exit(OVERFLOW);
	(**L).next=NULL;
	(**L).data=0;
	LinkList p;
	for(int i=n;i>0;--i)
	{
		p=(LinkList)malloc(sizeof(LNode));
		printf("▼请输入第%d个数: ",i);
		scanf("%d",&(*p).data);
		(*p).next=(**L).next;
		(**L).next=p;
	}
}

//main.cpp

#include "predefined.h"
#include"lianshijiegou.h"
Status equal(LinkList L,ElemType e)
{
	int i;
	for(i=1;;i++)
	{
		if((*L).data==e)  return i;
		else if((*L).next==NULL) return 0;
		else L=(*L).next;
	}
}
Status visit(LinkList L)
{
	printf("%d ",(*L).data);
	return OK;
}
int main()
{
	LinkList La,Lb,Lc;
	Status s;
	int n,m,i;
	ElemType e;
	printf("Function 1\n★函数 InitList_L(LinkList *L)测试...\n");  
	s=InitList_L(&La);
	printf("▲初始化单链表La: %d (0:失败 1:成功)\n\n",s);
	printf("Function 2\n★函数 ListEmpty_L(LinkList L)测试...\n");
	s=ListEmpty_L(La);
	printf("▲表La是否为空表: %d   (0:否 1:是)\n\n",s);
	printf("Function 3\n★函数 ListInsert_L(LinkList *L,int i,ElemType e)测试...\n");
	printf("▲请输入准备向La输入的个数:");
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
        printf("▲请输入La第%d个数:",i);
		scanf("%d",&m);
		s=ListInsert_L(&La,i,m);
		printf("▲插入成功?:%d   (1:成功 0:失败)\n",s);
	}
	printf("\n");
	printf("Function 4\n★函数 ListTraverse_L(LinkList L,Status (*visit)(LinkList L))测试...\n");  
	printf("▲La中的元素为:La={");
	ListTraverse_L(La,visit);
	printf("}\n\n");
	printf("Function 5\n★函数 ListLength_L(LinkList L)测试...\n");
	s=ListLength_L(La);
	printf("▲La的长度为:%d\n\n",s);
	printf("Function 6\n★函数 ListDelete_L(LinkList *L,int i,ElemType *e)测试...\n");
	ListDelete_L(&La,3,&e);
	printf("▲删除La中第3个元素:\"%d\"\n",e);
	printf("▲La中的元素为:La={");
	ListTraverse_L(La,visit);
	printf("}\n\n");
	printf("Function 7\n★函数 GetElem_L(LinkList L,int i,ElemType *e)测试...\n");
	GetElem_L(La,3,&e);
	printf("▲La中第三个位置元素为 \"%d\"\n\n",e);
	printf("Function 8\n★函数 LocateElem_L(LinkList L,ElemType e,Status (*compare)(LinkList L,ElemType e))测试...\n");
	s=LocateElem_L(La,6,equal);
	printf("▲La中第一个等于元素\"6\"的位置为 %d\n\n",s);
	printf("Function 9\n★函数 PriorElem_L(LinkList L,ElemType cur_e,ElemType *pre_e)测试...\n");
	PriorElem_L(La,5,&e);
	printf("▲La中元素\"5\"的前驱为 %d\n\n",e);
	printf("Function 10\n★函数 NextElem_L(LinkList L,ElemType cur_e,ElemType *next_e)测试...\n");
	NextElem_L(La,5,&e);
	printf("▲La中元素\"5\"的后继为 %d\n\n",e);
	printf("Function 11\n★函数  CreatList_L(LinkList *L,int n)测试...\n");
	printf("▲请输入准备向Lb输入的个数:");
	scanf("%d",&n);
	CreatList_L(&Lb,n);
	printf("▲Lb中的元素为:Lb={");
	ListTraverse_L(Lb,visit);
	printf("}\n\n");
	printf("Function 12\n★函数  MergeList(LinkList *La,LinkList *Lb,LinkList *Lc)测试...\n");
	MergeList(&La,&Lb,&Lc);
	printf("▲Lc中的元素为:Lc={");
	ListTraverse_L(Lc,visit);
	printf("}\n\n");
	printf("Function 13\n★函数 ClearList_L(LinkList *L)测试...\n");
	printf("▲Lc清空前 :");
	ListEmpty_L(Lc)?printf("表Lc为空!!!\n"):printf("表Lc非空!!!\n");
	ClearList_L(&Lc);
	printf("▲Lc清空后 :");
	ListEmpty_L(Lc)?printf("表Lc为空!!!\n\n"):printf("表Lc非空!!!\n\n");
	printf("Function 14\n★函数 DestroyList_L(LinkList *L)测试...\n");
	printf("▲Lc销毁前 :");
	Lc?printf("表Lc存  在!!!\n"):printf("表Lc不存在!!!\n");
	DestroyList_L(&Lc);
    printf("▲Lc销毁后 :");
	Lc?printf("表Lc存  在!!!\n\n"):printf("表Lc不存在!!!\n\n");
}
void MergeList(LinkList *La,LinkList *Lb,LinkList *Lc)
//算法2.12:已知线性表La和Lb中的数据元素按值非递减排列。
//归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列。
{
	LinkList pa,pb,pc;
	pa=(**La).next;     //指向表a第一个元素
	pb=(*Lb)->next;
	*Lc=pc=*La;         //用La的头结点作为Lc的头结点
	int i=1;
	while(pa&&pb)
	{
		if((*pa).data<=(*pb).data)
		{
			(*pc).next=pa;
			pc=(*pc).next;
			pa=(*pa).next;
		}
		else 
		{
			(*pc).next=pb;
			pc=(*pc).next;
			pb=(*pb).next;
		}
	}
	(*pc).next=pa?pa:pb;
	free(*Lb);
}

//lianshijiegou.h

typedef struct LNode{
	ElemType data;
	struct LNode *next;
}LNode,*LinkList;
Status InitList_L(LinkList *L);
Status DestroyList_L(LinkList *L);
Status ClearList_L(LinkList *L);
Status ListEmpty_L(LinkList L);
Status ListLength_L(LinkList L);
Status GetElem_L(LinkList L,int i,ElemType *e);
Status LocateElem_L(LinkList L,ElemType e,Status (*compare)(LinkList L,ElemType e));
Status PriorElem_L(LinkList L,ElemType cur_e,ElemType *pre_e);
Status NextElem_L(LinkList L,ElemType cur_e,ElemType *next_e);
Status ListInsert_L(LinkList *L,int i,ElemType e);
Status ListDelete_L(LinkList *L,int i,ElemType *e);
Status ListTraverse_L(LinkList L,Status (*visit)(LinkList L));
void CreatList_L(LinkList *L,int n);

Status equal(LinkList L,ElemType e);
Status visit(LinkList L);
void MergeList(LinkList *La,LinkList *Lb,LinkList *Lc);

//predefined.h

#include "stdio.h"
#include "stdlib.h"
#define   TRUE           1
#define   FALSE          0
#define   OK             1
#define   ERROR          0
#define   INFEASIBLE    -1
#define   OVERFLOW      -2
typedef   int Status;
typedef   int ElemType;


注意:二极指针的使用, scanf("%d",&a)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值