用c语言实现基本数据结构(链表)

用c语言实现基本数据结构(链表)

感觉写链表比较考验对指针的理解。。。
下图可以方便对链表中指针进行理解

List* L; //新建链表指针,没有指向任何东西
L = (List *malloc(sizeof(List)) //从堆中分配List大小的内存空间,赋给L,L就有了指向的空间。
*L //L指向的结构体,一般不用这种写法(主要是不方便)
L->data //L指向的结构体中的数据
L->next //L指向的结构体中的指针next,一个指针类型数据
//c语言的链表中,一个节点的意思就是一个结构体。

首先是单链表
结构体如下

typedef struct Linklist{
	int data;
	struct Linklist* next;
}List;

方法如下

void InitList(List *L); //初始化链表(建立头节点)
void CreateList(List *L);//创建链表,先输入待输入数据个数,再输入数据
List* FindNode(List *L, int n);//找到第n个节点(从1开始)
void InsertNode(List* L, int n, int data);//在第n个节点后插入节点
int ListLength(List* L);//返回链表长度
int DelNode(List *L, int n);//删除第n个节点
void PrintfList(List *L);//输出所有节点数据

完整代码如下

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

typedef struct Linklist{
	int data;
	struct Linklist* next;
}List;

void InitList(List *L){
	L = (List *)malloc(sizeof(List));
	L->data = 0;
	L->next = NULL;
	if(L == NULL){
		printf("create list wrong!!!\n");
	}
}

void CreateList(List *L){
	List *tailpoint = L;
	int len = 0;	
	while(len <= 0){
		printf("over input data length!\n");
		scanf("%d", &len);
	}
	for(int i = 0; i < len; i++){
		List* node = (List *)malloc(sizeof(List));
		scanf("%d", &node->data);
		node->next = NULL;
		tailpoint->next = node;
		tailpoint = node;
	}
	printf("end input!\n");
}

List* FindNode(List *L, int n){
	List *p = L;
	for(int i = 0; i < n; i++){
		if(p == NULL){
			printf("list crossover!!!\n");
			return NULL;
		}
		p = p->next;
	}
	return p;
}

void InsertNode(List* L, int n, int data){
	List* p = FindNode(L, n);
	List* node = (List*)malloc(sizeof(List));
	node->data = data;
	node->next = p->next;
	p->next = node;
}

int ListLength(List* L){
	List *p = L;
	int len = 0;
	while(p->next != NULL){
		p = p->next;
		len++;
	}
	return len;
}


int DelNode(List *L, int n){
	List *pre = FindNode(L, n-1);
	if(pre->next == NULL){
		printf("list crossover\n");
		return 0;
	}
	List *p = pre->next;
	pre->next = p->next;
	free(p);
	return 1;
}

void PrintfList(List *L){
	List *p = L->next;
	while(p != NULL){
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n");
}

测试代码如下

#include"myList.h"
	
int main(){
	List *list;
	List *node;
	printf("-----------------a\n");
	InitList(list);
	printf("-----------------b\n");
	CreateList(list);
	PrintfList(list);
	printf("-----------------c\n");
	node = FindNode(list, 1);
	printf("%d\n", node->data);
	printf("-----------------d\n");
	InsertNode(list, 3, 89);
	PrintfList(list);
	printf("-----------------e\n");
	printf("%d\n", ListLength(list));
	printf("-----------------f\n");
	DelNode(list, 2);
	PrintfList(list);
	return 0;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值