链表的创建

链式线性表的创建(顺序存取)

  1. 数据域:存储元素数值数据
  2. 指针域:存储直接后继结点的存储位置

头指针:是指向链表中第一个结点的指针

首元结点:是指链表中存储第一个数据元素的结点

头结点:是在链表的首元结点之前附设的一个结点

1、创建链表的结构体

typedef int ElemType;
typedef struct Londe {  //声明结点的类型和指向结点的指针类型
	ElemType  data;     //结点的数据域
	struct Londe* next; //结点的指针域

}Londe,*LinkList;  //LinkList为指向结构体Londe的指针类型

2、链表的初始化

//单链表的初始化
//生成新的结点作为头结点,用头指针L指向头结点
//将头结点的指针域置空 

void InitList(LinkList& L) {
	
	L->data = 0;
	L->next = NULL;

}

 这里需要注意的是在主函数中需要在声明定义了链表后,紧接着分配该链表的存储空间

即:L = (LinkList)malloc(sizeof(Londe)); 否则链表初始化无法传入主函数中

3、单链表的销毁


void DestroyList(LinkList& L) {
	LinkList p;
	while (L) {   //当L=NULL时结束循环
		p = L;
		L = L->next;
		free(p);
	}
}

4、清空单链表


	
	//只保留头指针和头结点
void ClearList(LinkList& L) {
	LinkList p, q; //p用来存储将要删除的结点,q用来存储下一结点的地址
	p = L->next;
	while (p) {   //当p=NULL时结束循环
		q = p->next;
		delete p;
		p = q;
	}
	L->next = NULL;  //将头结点指针域为空
}

5、求链表的表长


//从首元结点开始统计所有结点的个数
int LengthList(LinkList& L) {
	LinkList p; //用来存储下一个结点的地址
	int i=0;    //用来统计指针移动次数进而确定链表长度
	p = L->next;
	while (p) {
		i++;
		p = p->next;
	}
	return i;
}

6、取单链表中第i个元素的内容



ElemType Get(LinkList& L, int i) {
	LinkList p;
	int j = 0;          //使用计数从头结点开始指针开始移动,并且逐个
	p = L->next;        //比对对应的数据域是否与传入的参数相同,若是
	while (p) {         //相同则输出j的值即为要查找的位置
		j++;
		if (j == i) {
			return  p->data;
		}
		p = p->next;
		
		}

		
		//else  if (!p || i < 1) {   //当输入要查找的位置小于1时或者链表为空时
			return  -1;
		
}

7   1、按值查找(返回其对应的位置)


int Find(LinkList& L, ElemType e) {
	LinkList p;
	p = L->next;
	int j = 1;
	while (p) {
		if (p->data == e) {
			return j;
		}
		p = p->next;
		j++;
	}
	return 0;
 }

2、按所给位置查找(返回对应位置的数据域)


Londe*  Find1(LinkList& L, int i) {
	LinkList p;
	int j = 0;
	p = L->next;
	while (p && j < i) {
		p = p->next;
		j++;
	}
	return p;
}

8、插入


void  Inser(LinkList& L, int i, ElemType e) {
	LinkList p;
	//先找到i位置的i-1的结点
	p = L->next;
	int j = 0;
	while (p && j < i - 1) {
		p = p->next;
		j++;
	}
	
	if (!p || j > i - 1) {  //插入位置大于表长+1或小于1,插入位置非法
		printf("输入的位置非法");
	}
	LinkList s = new Londe;
	s->data = e;
	s->next = p->next;
	p->next = s;
	
 }

9、删除


ElemType  Delete_L(LinkList& L, int i,ElemType &e) {
	LinkList p,q;
	p = L;
	int j = 0;
	while (p->next&& j < i-1) {
		p = p->next;
		j++;         //找到i-1位置结点并将p指向该结点
	}
	if (!(p->next) || j > i - 1)
		return 0;
	q = p->next;   //要删除的元素的指针域
	e = q->data;
	delete q; //释放要删除的结点的空间
	return 1;
}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值