数据结构 | 顺序线性表

一、数据结构定义

typedef int ListType;
typedef struct node {
	ListType data;
	struct node* next;
} *Node, * LinkList;

二、方法概览

LinkList CreateLinkList(); // 创建只有头结点的空链表
void InsertHead(LinkList L, ListType data); // 单链表表头插入
void InsertTail(LinkList L, ListType data); // 单链表表尾插入
void PrintLinkList(LinkList L);		// 打印单链表
void ReverseLinkList(LinkList L);	// 链表逆置
int DestroyLinkList(LinkList L);	// 销毁单链表
int locateAndChange(LinkList L, ListType data); // 链表中查找 与data值相等的第一个结点

三、方法详解

// 创建只有头结点的空链表
LinkList CreateLinkList() {
	Node head = (Node)malloc(sizeof(struct node));
	if (head != NULL) {
		head->next = NULL;
		head->data = 0;
	}
	return head;
}
// 单链表表头插入
void InsertHead(LinkList L, ListType data){
	Node Head = (Node)malloc(sizeof(struct node));
	Head->data = data;
	Head->next = L->next;
	L->next = Head;
}
// 单链表表尾插入
void InsertTail(LinkList L, ListType data){
	Node p = L;
	while (p->next != NULL) p = p->next;
	Node Tail = (Node)malloc(sizeof(struct node));
	p->next = Tail;
	Tail->data = data;
	Tail->next = NULL;
}
// 打印单链表
void PrintLinkList(LinkList L) {
	Node tra = L->next;
	while (tra->next != NULL) {
		printf("%d ", tra->data);
		tra = tra->next;
	}
	printf("%d", tra->data);
}
// 链表逆置
void ReverseLinkList(LinkList L){
	Node p, q;
	p = L->next;
	L->next = NULL;
	while (p) {
		q = p;
		p = p->next;
		q->next = L->next;
		L->next = q;
	}
}
// 销毁单链表
int DestroyLinkList(LinkList L) {
	// 返回值为回收结点的个数,含头结点   
	Node p;
	int num = 0;
	while (L) {
		p = L;
		L = L->next;
		free(p);
		num += 1;
	}
	return num;
}
// 链表中查找 与data值相等的第一个结点
int locateAndChange(LinkList L, ListType data) {
	// 若能找到该结点,则将该结点的值与前驱结点的值交换
	// 若未找到与data值相等的结点,则返回值为-1
	// 若找到的结点无前驱结点,则返回值为0,否则返回值为前驱结点的值
	int temp;
	Node pre;
	pre = L;
	while (pre->next != NULL && pre->next->data != data)   pre = pre->next;
	if (pre->next->next == NULL) return -1;
	else if (pre == L) return 0;
	else {
		temp = pre->data;
		pre->data = pre->next->data;
		pre->next->data = temp;
		return pre->next->data;
	}
}

四、运行结果

        main方法代码如下:

int main() {
	LinkList L = CreateLinkList();
	for (int i = 1; i <= 10; i++) {
		InsertTail(L, i);
	}
	ReverseLinkList(L);
	PrintLinkList(L);
	DestroyLinkList(L);
}

        运行结果如下:

五、源代码

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

/* 单链表 */
typedef int ListType;
typedef struct node {
	ListType data;
	struct node* next;
} *Node, * LinkList;

LinkList CreateLinkList(); // 创建只有头结点的空链表
void InsertHead(LinkList L, ListType data); // 单链表表头插入
void InsertTail(LinkList L, ListType data); // 单链表表尾插入
void PrintLinkList(LinkList L);		// 打印单链表
void ReverseLinkList(LinkList L);	// 链表逆置
int DestroyLinkList(LinkList L);	// 销毁单链表
int locateAndChange(LinkList L, ListType data); // 链表中查找 与data值相等的第一个结点


// 创建只有头结点的空链表
LinkList CreateLinkList() {
	Node head = (Node)malloc(sizeof(struct node));
	if (head != NULL) {
		head->next = NULL;
		head->data = 0;
	}
	return head;
}
// 单链表表头插入
void InsertHead(LinkList L, ListType data){
	Node Head = (Node)malloc(sizeof(struct node));
	Head->data = data;
	Head->next = L->next;
	L->next = Head;
}
// 单链表表尾插入
void InsertTail(LinkList L, ListType data){
	Node p = L;
	while (p->next != NULL) p = p->next;
	Node Tail = (Node)malloc(sizeof(struct node));
	p->next = Tail;
	Tail->data = data;
	Tail->next = NULL;
}
// 打印单链表
void PrintLinkList(LinkList L) {
	Node tra = L->next;
	while (tra->next != NULL) {
		printf("%d ", tra->data);
		tra = tra->next;
	}
	printf("%d", tra->data);
}
// 链表逆置
void ReverseLinkList(LinkList L){
	Node p, q;
	p = L->next;
	L->next = NULL;
	while (p) {
		q = p;
		p = p->next;
		q->next = L->next;
		L->next = q;
	}
}
// 销毁单链表
int DestroyLinkList(LinkList L) {
	// 返回值为回收结点的个数,含头结点   
	Node p;
	int num = 0;
	while (L) {
		p = L;
		L = L->next;
		free(p);
		num += 1;
	}
	return num;
}
// 链表中查找 与data值相等的第一个结点
int locateAndChange(LinkList L, ListType data) {
	// 若能找到该结点,则将该结点的值与前驱结点的值交换
	// 若未找到与data值相等的结点,则返回值为-1
	// 若找到的结点无前驱结点,则返回值为0,否则返回值为前驱结点的值
	int temp;
	Node pre;
	pre = L;
	while (pre->next != NULL && pre->next->data != data)   pre = pre->next;
	if (pre->next->next == NULL) return -1;
	else if (pre == L) return 0;
	else {
		temp = pre->data;
		pre->data = pre->next->data;
		pre->next->data = temp;
		return pre->next->data;
	}
}

int main() {
	LinkList L = CreateLinkList();
	for (int i = 1; i <= 10; i++) {
		InsertTail(L, i);
	}
	ReverseLinkList(L);
	PrintLinkList(L);
	DestroyLinkList(L);
}

猜你喜欢

转载自blog.csdn.net/sun80760/article/details/131500744