其他分享
首页 > 其他分享> > 考研C语言数据结构-单链表(线性表的链式存储实现)

考研C语言数据结构-单链表(线性表的链式存储实现)

作者:互联网

考研C语言数据结构-单链表(线性表的链式存储实现)

#include <stdio.h>
#include <stdlib.h>

// 定义结点数据类型
typedef struct LNode {

	int data; // 数据域
	LNode* next; // 指针域
}LNode, *LinkList;

// 初始化一个带头结点的单链表
LinkList initLinkList(void) {

	LinkList L = (LinkList)malloc(sizeof(LNode));

	L->next = NULL;

	return L;
}

// 头插法创建单链表(逆序)
void headCreateLinkList(LinkList &L, int arr[], int length) {

	LNode *p = L;

	for(int i = 0;i < length;i++) {
	
		LNode *q = (LNode*)malloc(sizeof(LNode));

		q->data = arr[i];

		q->next = p->next;

		p->next = q;
	}
}

// 尾插法创建单链表
void rearCreateLinkList(LinkList &L, int arr[], int length) {

	LNode *rear = L;// 定义尾指针指向头结点

	for(int i = 0;i < length;i++) {
	
		LNode *p = (LNode*)malloc(sizeof(LNode));

		p->data = arr[i];

		p->next = NULL;

		rear->next = p;

		rear = p;
	}
}

// 单链表的遍历
void printLinkList(LinkList L) {

	LNode *p = L->next;

	int i = 1;

	while(p != NULL) {
	
		printf("单链表第%d个元素:%d\n", i++, p->data);

		p = p->next;
	}
}

// 插入操作
bool linkListInsert(LinkList &L, int index, int e) {

	if(index < 1)
		return false;

	LNode *p = L;

	int i = 0;// 计数器

	while(p != NULL && i < index - 1) {
	
		p = p->next;

		i++;
	}

	if(p == NULL)// p == NULL表明index > L.length + 1 不合理
		return false;

	LNode *q = (LNode*)malloc(sizeof(LNode));

	q->data = e;

	q->next = p->next;

	p->next = q;

	return true;

}

// 删除操作
bool linkListDelete(LinkList &L, int index, int &e) {

	if(index < 1)
		return false;

	LNode *p = L;

	int i = 0;// 计数器

	while(p != NULL && i < index - 1) {
	
		p = p->next;
		i++;
	}

	if(p == NULL)
		return false;

	LNode *q = p->next;

	p->next = q->next;

	e = q->data;

	free(q);

	return true;
}

// 按位查找
LNode* getElem(LinkList L, int index) {

	if(index < 1)
		return NULL;

	LNode *p = L;

	int i = 0;

	while(p != NULL && i < index) {
	
		p = p->next;

		i++;
	}

	if(p == NULL)
		return NULL;

	return p;
}

// 按值查找
LNode* locateElem(LinkList L, int e) {

	LNode *p = L;

	while(p->next != NULL) {
	
		if(p->next->data == e)
			return p->next;

		p = p->next;
	}

	return NULL;
}

// 获取表长
int getLength(LinkList L) {

	LNode *p = L;

	int i = 0;

	while(p->next != NULL) {
	
		p = p->next;

		i++;
	}

	return i;
}

int main(void) {

	LinkList L = initLinkList();

	int arr[] = {1,2,3,4,5,6};

	// 头插法创建单链表
	//headCreateLinkList(L, arr, 6);

	// 尾插法创建单链表
	rearCreateLinkList(L, arr, 6);

	printLinkList(L);

	printf("\n");

	linkListInsert(L, 1, 0);

	linkListInsert(L, 8, 7);

	printLinkList(L);

	printf("\n");

	int e = -1;
	linkListDelete(L, 1, e);
	printf("删除元素e:%d\n", e);
	printLinkList(L);

	linkListDelete(L, 7, e);
	printf("删除元素e:%d\n", e);
	printLinkList(L);

	LNode * p = getElem(L, 1);
	printf("按位查找第1个元素:%d\n", p->data);

	p = getElem(L, 6);
	printf("按位查找第6个元素:%d\n", p->data);

	p = locateElem(L, 1);
	printf("按值查找:%d\n", p->data);

	p = locateElem(L, 6);
	printf("按值查找:%d\n", p->data);

	printf("表长:%d\n", getLength(L));

	system("pause");
	return 0;
}

王道考研相关题目:

部分习题解法:

单链表总结:

标签:NULL,return,LNode,int,线性表,next,LinkList,C语言,考研
来源: https://www.cnblogs.com/dqlai/p/16199648.html