链式存储结构-链表的基本操作

数据结构链式存储
链式存储的基本概念:
基本特点
  • 逻辑上连续,物理上不连续
专有名词
  • 头指针(head):要想找到这个链表必须有头指针,它指向链表的第一个结点的地址

  • 头结点:可有可不有,并不存放数据,可以存放一些信息,如链表的长度等信息,也可以为空

  • 首元结点:第一个开始存放数据的结点

    单链表、双链表、循环链表
  • 单链表:结点只有一个指针域的链表叫做单链表

  • 双链表:结点有两个指针域的链表叫做双链表

  • 循环链表:最后一个元素指向第一个结点

通过有无头结点可以将链表划分为两种类型:
  1. 有头节点的链表:
    • 空表表示:头结点的指针域为空
    • 头结点的好处:便于首元结点的处理,便于空表和非空表的处理
  2. 无头结点的链表:
    • 空表表示:头指针为空
链表的一些基本操作
定义
typedef struct Lnode {
	int stuNum[8];
	char stuName[15];
	int score;
	struct Lnode* next;
}Lnode,*LinkList;
链表的初始化
void initList(LinkList& L) {
	L = (LinkList)malloc(sizeof(Lnode));
	L->next = NULL;
}
判断是否为空表
void judgeBlank(LinkList& L) {
	if (L->next == NULL)
		printf("该表为空\n");
	else
		printf("该表不为空\n");

}
链表销毁
void destroyList(LinkList& L) {

	LinkList p;
	while (L) {
		p = L;
		L = L->next;
		free(p);
		
	}
	printf("链表销毁成功!!");

}
清除链表
void clearList(LinkList& L) {
	LinkList p = L->next;
	LinkList q;
	while (p) {
		
		q = p->next;
		free(p);
		p = q;
	}
}
链表元素个数
int lengthList(LinkList& L) {

	Lnode* p;
	p = L->next;
	int length = 0;			//记录长度的变量
	
	while (p) {
		length++;
		p = p->next;
	}
	return length;
}
按照元素的个数取值
int getElem(LinkList& L,int i,int getScore) {
	Lnode* p;
	p = L->next;
	int j = 1;
	while (p && j < i) {
		p = p->next;
		j++;
	}
	if (!p || j > i) {
		printf("没有这个元素");
		return ERROR;
	}
	else {
		printf("有这个成绩,成绩的值为:%d", p->score);
		getScore = p->score;
		return OK;
	}	
}
寻找输入元素的地址
Lnode* Locationaddress(LinkList& L, int getScore) {
	
	Lnode* p = L->next;
	while (p && p->score != getScore) {
		p = p->next;
	}
	return p;
}
寻找输入元素的是第几个元素
int LocationIndex(LinkList& L, int getScore) {
	Lnode* p = L->next;
	int index = 1;
	while (p && p->score != getScore) {
		p = p->next;
		index++;
	}
	return index;
}
按照索引插入元素
int insertList(LinkList& L, int index, int stuNum, char stuName, int score) {
	Lnode* p = L;
	int i = 0;

	while (p && i < index-1) {
		p = p->next;
		i++;
	}
	if (!p || i > index - 1)
		return ERROR;
	Lnode* s = (Lnode *)malloc(sizeof(Lnode));

	s->stuNum = stuName;
	s->stuName = stuNum;
	s->score = score;


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

}
前插法建立链表
void createListHead(LinkList& L, int n) {
	
	L = (Lnode*)malloc(sizeof(Lnode));
	L->next = NULL;
	for (int i = n; i > 0; i--) {
		Lnode* p = (Lnode*)malloc(sizeof(Lnode));
		scanf("%d%s%d", p->stuNum, p->stuName, &(p->score));
		p->next = L->next;
		L->next = p;
		
	}
}
后插法建立链表
void createListR(LinkList& L, int n) {
	L = (Lnode*)malloc(sizeof(Lnode));
	Lnode* r = L;
	for (int i = n; i > 0; i--)
	{
		Lnode* p = (Lnode*)malloc(sizeof(Lnode));
		scanf("%d%s%d", p->stuNum, p->stuName, &(p->score));
		r->next = p;
		r = p;
	}	
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值