数据结构C语言基础代码4:头插法创建链表(以函数形式)

        网上代码以直接写在main()函数中实现创建居多,对于初学者如何实现在函数中creatList是一个问题,在学习过程中我将此实现,希望能帮助到同我一般的迷途的人,节约时间。具体代码如下,:(完整代码在最后)

        由于VS中无法使用scanf函数,本代码使用第一行来解决。

#define _CRT_SECURE_NO_WARNINGS 1

         printlist函数是输出函数,将LinkList传入后,首先将跳过头指针将指针跳到首个data数据输出,可以使用while重复,知道L->next ==null,值得注意的是当L->next==null,最后一个并没有输出,对此可以使用do-while来代替while,本文使用while结束再次输出L->data来解决该问题。

void printfList(LinkList L)
{
	L = L->next;
	while (L->next != NULL)
	{
		printf("%d",L->data);
		L = L->next;
	}
	printf("%d",L->data);
}

         c语言中可以通过指针来更改内容,但是本次代码我的困难是不知道如何将更改后值传回,故我使用了return,将新的Lreturn回主函数,在main函数中对L再次赋值,从容达到更改L内容的目的,假如有更好的方法欢迎大家指正。

LinkList creatListByhead(LinkList L,int n)
{
	LNode* s;
	int x;
	//建立头结点
	L = (LinkList)malloc(sizeof(LNode));
	L->next = NULL;
	//下来赋值
	for (int i = 0;i < n;i++)
	{
		scanf("%d",&x);

		s = (LinkList)malloc(sizeof(LNode));
		s->data = x;
		s->next = L->next;
		L->next = s;
	}
	return L;
}

         其中,第二个参数是指链表中元素个数(除去头指针),我这里设置为5,故scanf输入5个数字后执行printf,为了让能看清,我没有在printf中换行。

L =creatListByhead(L, 5);

        下面是完整的代码,大家可以直接复制到VS中直接运行

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;

typedef struct LNode
{
	ElemType data;
	struct LNode* next;
}LNode,*LinkList;

//头插法创建单链表
LinkList creatListByhead(LinkList L,int n)
{
	LNode* s;
	int x;
	//建立头结点
	L = (LinkList)malloc(sizeof(LNode));
	L->next = NULL;
	//下来赋值
	for (int i = 0;i < n;i++)
	{
		scanf("%d",&x);

		s = (LinkList)malloc(sizeof(LNode));
		s->data = x;
		s->next = L->next;
		L->next = s;
	}
	return L;
}
void printfList(LinkList L)
{
	L = L->next;
	while (L->next != NULL)
	{
		printf("%d",L->data);
		L = L->next;
	}
	printf("%d",L->data);
}

int main()
{
	LinkList L=NULL;
	L =creatListByhead(L, 5);
	printfList(L);
	return 0;
}

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
当我们需要存储一个图时,邻接表是一种常用的数据结构。在邻接表中,每个节点代表图中的一个顶点,每个节点包含一个指向该顶点的指针和一个指向与该顶点相邻的所有顶点的指针。邻接表的实现方法有多种,其中头插法是比较常用的一种。下面是关于头插法C语言代码及其详细注释: ```c #include <stdio.h> #include <stdlib.h> #define MAXVEX 100 // 定义图的最大顶点数 // 边表节点结构体 typedef struct EdgeNode { int adjvex; // 邻接点域,存储该顶点对应的下标 int weight; // 权值 struct EdgeNode *next; // 链域,指向下一个邻接点 } EdgeNode; // 顶点表结构体 typedef struct VertexNode { char data; // 顶点域,存储顶点信息 EdgeNode *firstedge; // 边表头指针 } VertexNode, AdjList[MAXVEX]; // 图结构体 typedef struct { AdjList adjList; // 邻接表 int numVertexes; // 图中当前顶点数 int numEdges; // 图中当前边数 } GraphAdjList; // 创建邻接表,采用头插法 void CreateALGraph(GraphAdjList *G) { int i, j, k; EdgeNode *e; printf("请输入顶点数和边数:\n"); scanf("%d %d", &(G->numVertexes), &(G->numEdges)); // 读入顶点信息,建立顶点表 for (i = 0; i < G->numVertexes; i++) { printf("请输入第%d个顶点的信息:", i+1); scanf(" %c", &(G->adjList[i].data)); G->adjList[i].firstedge = NULL; // 将边表置为空表 } // 建立边表 for (k = 0; k < G->numEdges; k++) { printf("请输入边(vi, vj)的下标i, j和权值:\n"); scanf("%d %d %d", &i, &j, &(e->weight)); // 生成边表节点e1和e2 e = (EdgeNode *) malloc(sizeof(EdgeNode)); e->adjvex = j; e->next = G->adjList[i].firstedge; G->adjList[i].firstedge = e; e = (EdgeNode *) malloc(sizeof(EdgeNode)); e->adjvex = i; e->next = G->adjList[j].firstedge; G->adjList[j].firstedge = e; } } int main() { GraphAdjList G; CreateALGraph(&G); return 0; } ``` 在上述代码中,我们定义了边表节点结构体EdgeNode,顶点表结构体VertexNode和邻接表结构体GraphAdjList。CreateALGraph函数用于创建邻接表。在该函数中,我们首先读入顶点信息,建立顶点表;然后读入边的信息,依次生成边表节点e1和e2,并采用头插法将它们插入到相应的邻接表中。需要注意的是,由于头插法是将新节点插入到链表的头部,因此在插入新节点之前需要先将该顶点原本的邻接点整体往后移一位。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值