-
//定义一个.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 如来佛祖
请按任意键继续. . .
*/
这样把代码分成了三个部分,主要是为了使代码的条理性更好,二是也方便修改与优化,个人觉得是一个不错的选择