c语言链表

  1. //定义一个.c文件
    #include <stdio.h>
    #include "linklist.h"
    
    
    /*初始化链表*/
    void Initlinklist(Linklist * list, elementtype * dataArray, int length)
    {
    	for (int i = 0; i < length; i++)
    		Insertlinklist(list, i + 1,dataArray[i]);
    }
    
    
    
    /*
    *   在指定的位置pos 处插入元素element
    *
    */
    void Insertlinklist(Linklist *list, int pos, elementtype element)
    {
    	//1.  创建空节点并为数据域赋值
    	Node *node = (Node *)malloc(sizeof(Node));
    	node->data = element;
    	node->next = NULL;
    	//2.  找到要插入位置的节点
    	if (pos == 1)
    	{
    		list->next = node;
    		list->length++;
    		return;
    	}
    	//通过循环找到要插入结点的位置
    	Node * currnode = list->next;
    	for (int i = 1; currnode && i < pos - 1; i++)
    	{
    		currnode = currnode->next;
    	}
    
    	//3.  将结点插入,并对接前面的结点
    	if (currnode)
    	{
    		node->next = currnode->next;
    		currnode->next = node;
    		list->length++;
    	}
    }
    	
    
    void Printlinklist(Linklist *list)
    {
    	Node *node = list->next;
    	if (!node)
    	{
    		printf("链表为空");
    		list->length = 0;
    		return;
    	}
    	for (int i = 0; i < list->length; i++)
    	{
    		printf("%d\t%s\n",node->data.id,node->data.name);//这里最开始写成了,node->data->name  会提示错误,表达式必须包含指针类型
    		node = node->next;
    	}
    }
    
    
    
    
    //定义一个头文件
    #pragma once
    #include <stdio.h>
    #include<stdlib.h>
    
    
    typedef struct
    {
    	int id;
    	const char *name;
    }elementtype;      //定义数据域
    
    
    /*d定义链表的结点,包括数据域和指针域*/
    typedef struct Node
    {
    	elementtype  data;    //数据域
    	struct Node *next;   //指针域
    }Node;//这里的Node表示 strct Node
    
    /*
    *   头结点
    * 注意,我们在定义链表时,会习惯性的定西头结点,以便统一链表结点的删除和插入操作
    *头结点也可以称作首元结点,最后一个结点叫做尾元结点
    */
    typedef struct Linklist
    {
    	Node *next;
    	int length;
    }Linklist;
    
    
    
    
    /*初始化链表*/
    void Initlinklist(Linklist * list, elementtype * dataArray, int length);
    
    
    
    /*
    *   在指定的位置pos 处插入元素element
    *
    */
    void Insertlinklist(Linklist *list, int pos, elementtype element);
    
    
    
    
    void Printlinklist(Linklist *list);
    

主函数

/*虽然共有多个.c文件,但是是以main 函数为主!!!!!!!!!*/
#include <stdio.h>
#include "linklist.h"

elementtype dataArray[] = {
	{ 1,"奇异博士" },
	{ 2,"齐天大圣" },
	{ 3,"菩提老祖" },
	{ 4,"如来佛祖" }
};
void Testlinklist();
void  Testlinklist()
{
	Linklist list;
	list.length = 0;//容易忽略
	Initlinklist(&list,dataArray,sizeof (dataArray)/sizeof (dataArray[0]));
	Printlinklist(&list);
}
int main()
{
	Testlinklist();
	return 0;
}

/*  输出结果是

1       奇异博士
2       齐天大圣
3       菩提老祖
4       如来佛祖
请按任意键继续. . .
*/

 这样把代码分成了三个部分,主要是为了使代码的条理性更好,二是也方便修改与优化,个人觉得是一个不错的选择

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值