数据结构---链表(C语言实现)

前两天面试,被链表干懵了,所以决定好好总结一下。

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

//定义链表中的复合数据域
typedef struct Student {
	char name[20];
	int num;
	int math;
}student;

/*	节点定义:声明了一个结构体类型 LinkList
*	提示:由于指针域中的指针要指向的也是一个节点,因此要声明为 Link 类型(这里要写成 struct Link* 的形式)。
*	否则编译器会报错
*/
typedef struct Node {
	int data;	//代表数据域,数据域可能不止一个,或者可以使用复合类型的数据域
	struct Node* next;	
}LinkList;


//创建头结点
LinkList* createList()
{
	LinkList* head = (LinkList*)malloc(sizeof(LinkList));
	head->next = NULL;
	head->data = 0;
	return head;
}

/*  创建普通节点
*	data 表示该节点存储的数据,如果有多个数据,则多加参数即可
*/
LinkList* createNode(int data)
{
	LinkList* newNode = (LinkList*)malloc(sizeof(LinkList));
	newNode->next = NULL;
	newNode->data = data;
	return newNode;
}

/*	插入节点,头插法:即从头结点开始往后插入,每次改变头结点指向的指针
*	head:	传入头结点
*	data:	要插入的数据
*/
void insertNodeByhead(LinkList* head, int data)
{
	LinkList* newNode = createNode(data);
	newNode->next = head->next;
	head->next = newNode;
}

/*	插入节点,尾插法: 从尾结点开始插入
	head:	每次都传入头结点,然后遍历到尾结点
*/
void insertNodeBytail(LinkList* head, int data)
{
	LinkList* newNode = createNode(data);
	while (head->next != NULL) {
		head = head->next;
	}
	LinkList* tail = head;
	newNode->data = data;
	tail->next = newNode;
	tail = newNode;
	tail->next = NULL;
}

/*	插入节点,随机插入节点
*	head:	表示链表头结点
*	elem:	表示新数据的元素
*	add:	表示新元素要插入的位置
*/
void insertNode(LinkList* head, int elem, int add)
{
	LinkList* temp = head;
	for (int i = 1; i < add; i++) {
		temp = temp->next;
		if (temp == NULL) {
			printf("插入位置无效");
		}
	}
	LinkList* newNode = createNode(elem);
	newNode->next = temp->next;
	temp->next = newNode;
}


/*	链表删除,删除指定节点
	postData:	删除数值为k的节点
*/
void deleteNodeByAppoin(LinkList* headNode, int postData)
{
	LinkList* postNode = headNode->next;	//从头结点开始遍历
	LinkList* postNodeFront = headNode;
	if (postNode == NULL) {
		printf("无法删除 链表为空\n");
	}
	else {
		while (postNode->data != postData) {
			postNodeFront = postNode;	//将前一个节点移到当前节点
			postNode = postNodeFront->next;	//将当前节点往后一个
			if (postNode == NULL) {
				printf("没有找到相关信息,无法删除\n");
				return;
			}
		}
		postNodeFront->next = postNode->next;
		free(postNode);	//删除节点后,释放该节点的内存空间
	}
}

/*	查找节点
*	head:	链表头结点
*	elem:	待查找元素
*/
int selectElem(LinkList* head, int elem)
{
	LinkList* temp = head;
	int i = 1;
	while (temp->next) {
		temp = temp->next;
		if (temp->data == elem) {
			return i;
		}
		i++;
	}
	return -1;
}

/*	更新节点
*	
*/
void 





/*	打印链表
*/
//打印链表
void printList(LinkList* head)
{
	LinkList* pmove = head->next;
	while (pmove) {
		printf("%d \t", pmove->data);
		pmove = pmove->next;
	}
	printf("\n");
}

int main()
{
	LinkList* list = createList();
	insertNodeBytail(list, 1);
	insertNodeBytail(list, 2);
	insertNodeBytail(list, 3);
	printList(list);
	//deleteNodeByAppoin(list, 2);
	//printList(list);

	insertNode(list, 4, 4);
	printList(list);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值