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

本文通过C语言实现链表的基本操作,包括创建、查找、插入和删除等,并附带完整代码示例。适合初学者练习数据结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据结构-链表练习

引用一篇关于地址、指针讲解的文章
https://blog.youkuaiyun.com/wallying/article/details/83141536

#include <stdio.h>
 
//一般用"地址"表示常量,用"指针"表示存储地址的变量
int     x = 3;   //定义int型变量x,内容为整数3
int   *px = &x;  //定义指向int型变量的指针px,内容为变量x的地址
int **ppx = &px; //定义指向int型变量地址的指针ppx,内容为指针px的地址
 
int main(int argc, char *argv[])
{
    printf("Hello C-Free!\n");
 
    printf("   &x = %p\r\n", &x);//x的地址
    printf("    x = %d\r\n\n",  x);//x的内容
 
    printf("  &px = %p\r\n", &px);//px的地址
    printf("   px = %p\r\n",  px);//px的内容
    printf("  *px = %d\r\n\n", *px);//px的内容作为地址的内容
 
    printf(" &ppx = %p\r\n",  &ppx);//ppx的地址
    printf("  ppx = %p\r\n",   ppx);//ppx的内容
    printf(" *ppx = %p\r\n",  *ppx);//ppx的内容作为地址的内容
    printf("**ppx = %d\r\n\n", **ppx);//ppx的内容作为地址的内容再作为地址的内容
 
    getchar();
    return 0;
}

以下是链表的C语言实现,比较简单,作为练习。随着学习的深入会逐步发图、栈、队列、哈希表等。

/*链表独立练习*/
#include<stdio.h>
#include<stdlib.h>

typedef int elem;	//定义链表中数据类型 
typedef struct lnode
{
	elem data;	//定义数据元素 
	struct lnode *next;	//结构指针 
}lnode;


lnode *crearlistnode(int n);	//创建结构体,结构如上定义 
int getelem(lnode L,int i);		//查找元素,在链表L中查找第i个位置上的元素 
int insertlist(lnode *L,int i,elem e);	//插入,在链表L中在第i位置插入元素e 
int deletlist(lnode *L,int i);//,elem &e	//删除,在链表L中,删除i位置元素 



lnode *crearlistnode(int n)	//头插法函数及其参数 int n 为形参 
{
	lnode *L;	//定义头节点 
	L = (lnode *)malloc(sizeof(lnode));	//申请一个结构体结点大小的地址并把其指针指向L
	L->next = NULL;
	lnode *p;	//新建结点的地址
	printf("输入%d个值插入链表\n",n);
	for(int i=n; i>0 ;--i)
	{
		p = (lnode *)malloc(sizeof(lnode));	//新建一个结点
		scanf("%d",&p->data);
		p->next = L->next;
		L->next = p; 
	}
	return L;
}

int getelem(lnode L,int i)//,elem &e)		//查找的链表-查找的位置-将查找到的元素导出 
{
	int e= 0;
	lnode *head,*p;	//定义头指针以及查找下表值
	head = &L;		//找到链表位置
	p = head;		//指针指向头结点
	int j = 0;	//计数用
	while(p!=NULL&&j<i)
	{
		p = p->next;
		j++;
	} 
	if(p==NULL || j>i) return -1;
	e = p->data;		//将值带出 
	printf("所要查找的第%d个元素值为:%d\n",i,e);
	return 0;
	 
 } 

int insertlist(lnode *L,int i,elem e)		//操作链表-插入位置-插入元素 
{
	lnode *p;	//找到i-1结点(在其后面插入新元素)
	int j = 0;
	p = L;
	while(p!=NULL&&j<i-1)
	{
		p = p->next;
		j++;	
	}	//循环结束(找到了需要的位置)
	lnode *s = (lnode *)malloc(sizeof(lnode));//找到待插入位置后新建待插入单元
	s->data = e;	//填入数据 
	s->next = p->next;	//新插入单元指向后继 
	p->next = s; //原前位置指向新插入单元 
	return 0; 
 } 


int deletlist(lnode *L,int i)//,elem &e//操作链表-删除位置-删除元素
{
	lnode *p,*q;	//p找到删除位置前结点。q标记删除位置
	int j = 0;
	p = L;
	while(p!=NULL&&j<i-1)
	{
		p = p->next;
		j++;
	} 
	q = p->next;
	p->next = q->next;
//	e = q->data;
	return 0; 
 } 


int main()
{
	lnode *L;			//声明链表,结构体 
	L = crearlistnode(5);//创建链表,(n个结点)
	//getelem(*L,1); 	//查找元素,(对链表L操作,查找第2个位置元素)
	insertlist(L,1,99);	//插入元素,(对链表L操作,第1位置插入元素99)
	elem e; 
	deletlist(L,3); 	//删除元素,(第3个位置,删除) 
	getelem(*L,4); 		//查找元素,(对链表L操作,查找第4个位置元素)
	lnode *p;
	p = L;
	printf("输出线性表:\n");
	while(p->next!=NULL)
	{
		p = p->next;
		printf("%d	",p->data);
	} 
	//system("pause");
	return 0;
}

最后有些问题想求助。本人双非研一学生,研究方向为遥感图像变化检测。由于转专业,且能力不强打算自己研究C语言,敲出数据结构中的重要结构然后深入学习JAVA语言,而后学习前端或者后端开发等。只学过C语言且比较基础。想问问我这个想法可行否?有什么好的建议吗?

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值