0
点赞
收藏
分享

微信扫一扫

数据结构-----线性表(单链表实现)

无愠色 2022-03-17 阅读 60

实现了基本的单链表的:初始化,指定定位置添加结点,指定位置删除结点,按值查找返回指针。插入、删除位置均从0开始计数。
其中初始化使用了带头结点的链表,深刻体会到头结点的好处,

  1. 统一了第一个位置上和其余位置上的操作,都可以用 node-> 的操作,无需对头指针特殊操作。
  2. 对空表和非空表的操作得到了统一,判断条件都是node->next== NULL。
#include <stdio.h>
#include <stdlib.h>

typedef struct _node {
	int value;
	struct _node *next;
} Node;

void print(Node *hNode);//输出链表
Node *InitList(); //头插法建立链表。-1表示输入结束
void InsertNode(Node *p, int loc, int num);//在第i个位置上插入一个结点,该结点的value是num;(位置从0开始)
void DeleteNode(Node *hNode, int loc); //删除结点
Node *LocateElem(Node *hNode, int a);//按值查找

int main() {
	//初始化链
	Node *hNode = InitList();
	printf("初始化链表:");
	print(hNode);
	//链中插入结点
	InsertNode(hNode, 3, 7);
	printf("\n插入结点后:");
	print(hNode);
	Node *p = LocateElem(hNode, 7);
	printf("\n查找的目标是%d", p->value);
	//删除结点
	DeleteNode(hNode, 3	);
	printf("\n删除结点后:");
	print(hNode);
}

Node *InitList() {
	int number;
	Node *hNode = (Node *)malloc(sizeof(Node)); //hNode是指向头结点的指针
	hNode->value = 0;
	hNode->next = NULL;
	do {
		scanf("%d", &number);
		if (number != -1) {
			Node *p = (Node *)malloc(sizeof(Node));
			p->value = number;
			p->next = hNode->next;
			hNode->next = p;//如果改用头指针,则需要对指针赋值,将指针指向第一个结点。
		}
	} while (number != -1);
	return hNode;
}

void InsertNode(Node *p, int loc, int num) { //p是指向头结点的头指针
	int i = 0;
	Node *index = p;//index指向头结点,头结点不计算在链长内
	Node *q = (Node *)malloc(sizeof(Node));//q为新结点
	q->value = num;

	if (index->next == NULL) {
		index->next = q;
		q->next = NULL;
	} else {
		while (index->next) {
			if (i == loc) {
				q->next = index->next;
				index->next = q;
				break;
			} else {
				index = index->next;
				i++;
			}
		}
	}
}

void DeleteNode(Node *hNode, int loc) {
	int i = 0;
	Node *p = hNode->next;
	Node *q = hNode;//q指向p的前一个结点
	if (p->next == NULL) {
		printf("删除失败");
	} else {
		while (p->next) {
			if (i == loc) {
				if (i == 0)
					q->next = p->next;
				else
					q->next = p->next;
				free(p);
				break;
			} else {
				q = p;
				p = p->next;
				i++;
			}
		}
	}
}

Node *LocateElem(Node *hNode, int a) {
	int i = 0;
	Node *p = hNode->next;
	if (p == NULL) {
		printf("查找失败");
		return NULL;
	}
	while (p->next && p->value != a) {
		p = p->next;
	}
	return p;
}

void print(Node *hNode) {
	Node *p = hNode->next;
	while (p) {
		printf("%d ", p->value);
		p = p->next;
	}
}
举报

相关推荐

0 条评论