数据结构之链表

在数组中数据多的时候,插入和删除变的非常麻烦,引入链式存储就可以很容易。链表的结构如图所示,然后用C语言来把它实现。

                 

#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int num;//4
float data;//4
struct Node *pNext;//4
}node;


void main()
{
node *pnode;//定义一个头结点
node node1, node2, node3;//定义三个结点


node1.num = 1;//对三个结点进行赋值
node2.num = 2;
node3.num = 3;
node1.data = 12.0;
node2.data = 13.0;
node3.data = 14.0;


pnode = &node1;//让头结点指向第一个结点
node1.pNext = &node2;//依次指向下一个结点
node2.pNext = &node3;
node3.pNext = NULL;//尾结点为空
printf("%d\n",pnode->num); 
printf("%d\n", pnode->pNext->num);
printf("\n\n");
while (pnode != NULL)//循环输出
{
printf("%p,%p",pnode,pnode->pNext);
printf("   %d,%f\n",pnode->num,pnode->data);
pnode = pnode->pNext;
}
system("pause");
}

用函数来实现链表的增加、删除、查改、修改、排序、逆序六大操作。

/*
链表的实现
*/
#include<stdio.h>
#include<stdlib.h>
#define datatype int   //用datatype来代替int类型

typedef struct node
{
	int num;//数据域
	datatype data;
	struct node *pNext;//指针域,指向下一个结点
}Node;

//增加,删除,查改,修改,排序,逆转六大操作
void backaddnode(Node **pnode,int num,datatype data);//尾部增加结点
void showallnode(Node *pnode);

void main()
{
	//定义一个头节点
	Node *pnode=NULL;
	backaddnode(&pnode, 1, 11);
	backaddnode(&pnode, 2, 12);
	backaddnode(&pnode, 3, 13);
	backaddnode(&pnode, 4, 14);
	backaddnode(&pnode, 5, 15);
	showallnode(pnode);
	system("pause");
}
void showallnode(Node *pnode)
{
	printf("\n打印链表\n");
	while (pnode !=NULL)
	{
		printf("%d,%d\n", pnode->num, pnode->data);
		pnode = pnode->pNext;
	}
}
void backaddnode(Node **ppnode, int num, datatype data)
{
	Node *pnewnode = (Node*)malloc(sizeof(Node));
	pnewnode->num = num;//赋值,新建一个节点
	pnewnode->data = data;
	pnewnode->pNext = NULL;//尾部
	if (*ppnode == NULL)
	{
		*ppnode = pnewnode;//新建节点的地址
		pnewnode->pNext = NULL;
	}
	else
	{
		Node *p = *ppnode;//等于头节点
		while (p->pNext != NULL)//循环输出
		{
			p = p->pNext;//一直循环到最后一个节点
		}
		p->pNext = pnewnode;//新插入的节点
	}	
}

另外用返回值的一种写法

/*
链表实现的增加
*/
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
	int num;
	struct node *pNext;
}Node,*pNode;

pNode creat_list();
void showlist(pNode pHead);

void main()
{
	pNode pHead = NULL;//定义一个头节点
	pHead = creat_list();//创造一个链表
	showlist(pHead);//显示链表数据
	system("pause");
}

pNode creat_list()
{
	int len;
	int val;
	pNode pHead=(pNode)malloc(sizeof(Node));//头节点分配内存
	if (pHead == NULL)
	{
		printf("分配内存失败!");
		exit(-1);//退出程序
	}
	else
	{
		pNode pTail = pHead;
		pTail->pNext = NULL;
		printf("please enter numbres: ");
		scanf_s("%d", &len);
		for (int i = 0; i < len; i++)
		{
			printf("please enter %d numbre: ",i+1);
			scanf_s("%d", &val);
			pNode pNewnode = (pNode)malloc(sizeof(Node));
			pNewnode->num = val;//存放输入的值到数据域
			pTail->pNext = pNewnode;//存放前一个节点的地址
			pNewnode->pNext = NULL;
			pTail = pNewnode;
		}
	}	
	return pHead;
}

void showlist(pNode pHead)
{
	printf("打印链表\n");
	pNode p = pHead->pNext;
	while (p != NULL)
	{
		printf("%d ", p->num);
		p = p->pNext;
	}
	printf("\n");
}





  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值