【数据结构】C语言实现顺序链表

前端之家收集整理的这篇文章主要介绍了【数据结构】C语言实现顺序链表前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

这是在上数据结构课程时候的练习,以后拿过来随时用。


#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

typedef int elemtype;

#define TRUE 0
#define FALSE 1
#define OK 1
#define ERROR 0
#define INFEASIBLE -1


#if(1)

typedef struct LNode
{
	struct LNode *next;
	int date;
}*LinkList;

//typedef LNode *LinkList;

#endif

#if(0)

typedef struct LNode
{
	struct LNode *next;

	elemtype data;
};

#endif

void InitList(LinkList L)
{
	L = (LinkList)malloc(sizeof(struct LNode));
	if(!L)
	{
		exit(-1);
	}
	L->next = NULL;
}

void DestroyList(LinkList L)
{
	LinkList q;
	while(L)
	{
		q = L->next;
		free(L);
		L = q;
	}
}

void ClearList(LinkList L)
{
	LinkList p,q;
	p = L->next;          //p = L的话就销毁了链表相当于DestroyList
	while(p)
	{
		q = p->next;
		free(p);
		p = q;
	}

	L->next = NULL;
}

int ListEmpty(LinkList L)
{
	if(L->next)
	{
		return FALSE;
	}

	return TRUE;
}

int ListLength(LinkList L)
{
	int i = 0;
	LinkList p = L->next;        //应该设立一个新的指针代替L,

	while(p)
	{
		i++;
		p = p->next;
	}

	return i;
}

int GetElem(LinkList L,int i,elemtype *e)
{
	int j;
	LinkList p;
	p = L;

	for(j = 0; j < i; j++)
	{
		p = p->next;
	}

	if(!p)
	{
		return ERROR;
	}

	*e = p->date;

	return OK;

}

int LocateElem(LinkList L,elemtype *e)
{
	int i = 0;
	LinkList p;
	p = L->next;

	while(p)
	{
		i++;

		if(p->date == *e)
		{
			return i;
		}

		p = p->next;
	}

	return 0;
}

int PriorElem(LinkList L,elemtype cur_e,elemtype *pre_e)
{
	LinkList p,q;

	p = L->next;

	while(p->next)
	{
		q = p->next;

		if(q->date == cur_e)
		{
			*pre_e = p->date;

			return OK;

		}

		p = q;
	}

	return INFEASIBLE;
}

int NextElem(LinkList L,elemtype *next_e)
{
	LinkList p;               //remember it

	p = L->next;

	while(p->next)
	{

		if(p->date == cur_e)
		{
			*next_e = p->next->date;
			return OK;
		}

		p = p->next;

	}

	return INFEASIBLE;

}

int ListInsert(LinkList L,elemtype e)
{
	int j = 1;
	LinkList p = L,s;

	if(i < 1)
	{
		return ERROR;
	}
	s = (LinkList)malloc(sizeof(struct LNode));
	s->date = e;
	if(i == 1)
	{
		s->next = L;

		L = s;
	}
	else
	{
		while(p && j < i - 1)
		{
			p = p->next;
			j++;
		}
		if(!p)
		{
			return ERROR;

		}
		s->next = p->next;
		p->next = s;
	}
	return OK;

}

int ListDelete(LinkList L,elemtype *e)
{
	int j = 1;
	LinkList p = L->next;
	LinkList q = L;

	while(j < i)
	{
		p = p->next;
		q = q->next;
		j++;
	}

	if(!p || j >= i)
	{
		return ERROR;
	}

	q->next = p->next;
	*e = p->date;
	free(p);

	return OK;
}

void ListTraverse(LinkList L)
{
	LinkList q = L;
	while(q)
	{
		printf("%d ",q->date);
		q = q->next;
	}

	//printf("\n\n");
}


#if(0)

void main()
{ // 除了几个输出语句外,主程序和main2-1.cpp很像
	LinkList L = NULL; // 与main2-1.cpp不同
	elemtype e,e0;
	int i;
	int j,k;

	InitList(L);

	for(j=1; j<=5; j++)
	{
		i = ListInsert(L,1,&j);
	}

	printf("在L的表头依次插入1~5后:L=");

	ListTraverse(L); // 依次对元素调用print(),输出元素的值

	i = ListEmpty(L);

	printf("L是否空:i=%d(1:是0:否)\n",i);

	ClearList(L);

	printf("清空L后:L=");

	ListTraverse(L);
	i = ListEmpty(L);

	printf("L是否空:i=%d(1:是0:否)\n",i);

	for(j=1; j<=10; j++)
	{
		ListInsert(L,j,&j);
	}

	printf("在L的表尾依次插入1~10后:L=");

	ListTraverse(L);
	GetElem(L,5,&e);

	printf("第5个元素的值为%d\n",e);
	for(j=0; j<=1; j++)
	{
		k = LocateElem(L,&j);
		if(k)
		{
			printf("第%d个元素的值为%d\n",k,j);
		}
		else
		{
			printf("没有值为%d的元素\n",j);
		}
	}
	for(j=1;j<=2;j++) // 测试头两个数据
	{
		GetElem(L,&e0); // 把第j个数据赋给e0
		i = PriorElem(L,e0,&e); // 求e0的前驱
		if(i == INFEASIBLE)

			printf("元素%d无前驱\n",e0);
		else
			printf("元素%d的前驱为%d\n",e);
	}
	for(j=ListLength(L)-1; j<=ListLength(L); j++) // 最后两个数据
	{
		GetElem(L,&e0); // 把第j个数据赋给e0
		i=NextElem(L,&e); // 求e0的后继
		if(i == INFEASIBLE)
		{
			printf("元素%d无后继\n",e0);
		}
		else
		{
			printf("元素%d的后继为%d\n",e);
		}
	}
	k = ListLength(L); // k为表长

	for(j=k+1; j>=k; j--)
	{
		i = ListDelete(L,&e); // 删除第j个数据
		if(i == ERROR)
		{
			printf("删除第%d个元素失败\n",j);
		}
		else
		{
			printf("删除第%d个元素成功,其值为%d\n",e);
		}
	}
	printf("依次输出L的元素:");

	ListTraverse(L);
	DestroyList(L);

	printf("销毁L后:L=%u\n",L);
}

#endif

void main()
{
	LinkList L = NULL;
	int i,j;
	InitList(L);

	for(j=1; j<=5; j++)
	{
		i = ListInsert(L,j);
	}

	printf("在L的表头依次插入1~5后:L=");

	ListTraverse(L); // 依次对元素调用print(),输出元素的值
}

猜你在找的数据结构相关文章