单链表操作

一、要求       

 编写一个程序linklist.cpp (或.c),实现单链表的各种基本运算和整体建表算法(假设顺序表的内容类型ElemType为char),并在此基础上设计一个程序exp3.cpp (或.c) 完成一下功能。

(1)  初始化一个单链表L。

(2)  采用尾插法依次将元素a、b、c、d、e插入单链L中。

(3)  输出单链表L。

(4)  输出单链表L的长度。

(5)  判断单链表L是否为空。

(6)  输出单链表L的第3个长度。

(7)  输出元素a的位置。

(8)  在单链表L的第4个元素位置上插入元素f。

(9)  输出单链表L。

(10) 删除单链表L的第3个元素。

(11) 输出单链表L。

(12) 销毁单链表L。

二、代码实现:

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define OK 1
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0
#define ERROR 0
typedef char ElemType;
typedef int Status;
typedef struct LNode {

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

//初始化单链表
Status InitList(LinkList &L)     //初始化线性表
{
	L = (LinkList )malloc(sizeof(LNode));     //创建头结点
	if (!L) {
		exit(OVERFLOW);
	}
	L->next = NULL;
	return OK;
}
//输出单链表
void DispList(LinkList &L)
{
	  LinkList p;
	  p = L->next;
	while (p != NULL)
	{
		printf("%c  ", p->data);
		p = p->next;
	}
	printf("\n");
}

//输出单链表长度
int lengthList(LinkList &L)
{
	int n = 0;
	LinkList p = L->next;
	while (p != NULL)
	{
		n++;
		p = p->next;
	}
	return n;
}

//判断单链表是否为空
int emptyList(LinkList &L)
{
	if (L->next== NULL)
		return  TRUE;
	else
		return FALSE;
}

//查值
Status GetElem(LinkList &L, int i, ElemType &e)
{

	int j=1;
	LinkList p = L->next;			//struct LNode *p = L->next;
	while (p&&(j < i))
	{
		p = p->next;
		++j;
	}
	if (!p || j > i)
		return ERROR;
	e = p->data;
	return OK;
}

//查元素位置
int LocateElem(LinkList L, ElemType e)  
{
	int i = 1;
	LinkList p = L->next;        //p指向开始节点,i置为1(即开始节点的序号为1)
	while (p != NULL && p->data != e)   //查找data值为e的节点,其序号为i
	{
		p = p->next;
		i++;
	}
	if (p == NULL)                //不存在元素值为e的节点,返回0
		return(0);
	else                        //存在元素值为e的节点,返回其逻辑序号i
		return(i);
}

//插入
Status ListInsert(LinkList &L, int i, ElemType e)
{
	
	int j = 0;
	LinkList p = L,s;
	while (p&&(j<i-1))
	{
		p = p->next;
		++j;
	}
	if (p == NULL)
		return ERROR;
	else
	{
		s=(LinkList )malloc(sizeof(LNode));
		s->data = e;
		s->next = p->next;
		p->next = s;
		return OK;
	}
}

//删除链表中的元素
Status ListDelete(LinkList &L, int i)
{
	int j = 0;
	LinkList p = L,q;
	while ((p->next) && (j < i - 1))
	{
		p = p->next;
		++j;
	}
	if (!(p->next) || (j > i - 1))
		return ERROR;
	q = p->next;
	p->next = q->next;
	delete q;
	return OK;
}


//销毁单链表
Status DestroyList(LinkList &L)
{
	LinkList q = L;
	while (q != NULL)
	{
		LinkList p = q;
		q = q->next;
		free(p);
		p = NULL;
	}
	return OK;
}
//exp3.cpp
# include<stdio.h>
int main()
{
	int m;
	ElemType e;
	LinkList(L);
	printf("1:初始化链表L\n");
	InitList(L);
	printf("2:将a,b,c,d,e插入到单链表L里\n");
	ListInsert(L, 1, 'a');
	ListInsert(L, 2, 'b');
	ListInsert(L, 3, 'c');
	ListInsert(L, 4, 'd');
	ListInsert(L, 5, 'e');
	printf("3:输出单链表L:");
	DispList(L);
	m = lengthList(L);
	printf("4:输出单链表L的长度:%d\n",m);
	printf("5:单链表L为:  %s \n", (emptyList(L) ? "空" : "非空"));
	GetElem(L, 3, e);
	printf("6:单链表L第3个元素:%c\n",e);
	printf("7:单链表L中a元素的位置:%d\n", LocateElem(L,'a'));
	printf("8:在单链表L第4个元素位置插入f\n");
	ListInsert(L, 4, 'f');
	printf("9:插入f后的单链表L为:");
	DispList(L);
	printf("10:删除单链表L的第3个元素\n");
	ListDelete(L, 3);
	printf("11:删除第3个元素后的单链表L为:");
	DispList(L);
	printf("12:销毁单链表L\n");
	DestroyList(L);

	while (1);
	return 0;
}

三、运行结果

 

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值