数据结构——动态链表

说明:严蔚敏的《数据结构》(C语言版)学习笔记,记录一下,以备后面查看。


#include <stdio.h>
#include <malloc.h>

const int OK = 1;  //定义正确返回
const int ERROR  = -1;  //定义错误的返回
const int OVERFLOW = -2; //定义溢出

//定义元素类型
typedef int ElemType;
//定义返回类型
typedef int Status;

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

//获取第i个元素(L为带头结点的单链表的头指针)
Status GetElem_L(LinkList L, int i, ElemType &e){
	LinkList p = L->next; //L->next指向头结点
	int j = 1;
	while(p&&j<i){
		p = p->next;
		++j;
	}
	if(!p || j>i) return ERROR;
	e = p->data;
	return OK;
}

//插入元素(第i个位置之前插入元素)
Status ListInsert_L(LinkList L, int i, ElemType &e){
	LinkList p = L; //头结点
	int j = 0;
	while(p && j<i-1){
		p = p->next;
		++j;
	}
	if(!p || j>i-1) return ERROR;
	LinkList s = (LinkList)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;
	return OK;
}

//删除第i个元素
Status ListDelete_L(LinkList &L, int i, ElemType &e){
	LinkList p = L; //p指针指向头结点
	int j = 0; 
	while(p && j<i-1){
		p = p->next;
		++j;
	}
	if(!p || j>i-1) return ERROR;
	LinkList s = p->next;
	p->next = s->next;
	e = s->data;
	free(s);
	return OK;
}


//创建链表,并添加n个数据结点
void CreateList_L(LinkList &L, int n){
	L = (LinkList)malloc(sizeof(LNode));
	L->next = NULL;  //创建一个带头结点的单链表
	int i;
	LinkList p;
	for(i=n;i>0;--i){
		p = (LinkList)malloc(sizeof(LNode));
		printf("请输入链表第%d个元素的数据:
", i);
		scanf("%d", &p->data);
		p->next = L->next; //头插法
		L->next = p;
	}
}

//遍历链表
void ShowList_L(const LinkList &L){
	LinkList p = L->next;
	int j = 1;
	while(p){
		printf("链表的第%d个元素是%d
", j, p->data);
		p = p->next;
		++j;
	}
}

int main(){
	LinkList L;
	printf("============创建5个数据结点============
");
	CreateList_L(L, 5);
	ShowList_L(L);
	printf("============删除了第5个元素============
");
	ElemType e;
	ListDelete_L(L, 5, e);
	ShowList_L(L);
	printf("============添加第5个元素=============
");
	ListInsert_L(L, 5, e);
	ShowList_L(L);

	scanf("%d");
	return 0;
}
部分说明:

1、第i个元素之前插入元素

如上图所示,假如现在有4个元素,那么有四个可选插入位置(①②③④):

让p先指向头结点,我们需要找到第i-1个结点,也就是需要插入位置的前一个结点,比如我们要插入到i=3,那么需要找到2位置,插入到③位置。


原文地址:https://www.cnblogs.com/lanzhi/p/6468673.html