建议想学懂以下内容的新手小白先弄懂结构体,想完成老师作业的直接翻到最后面,有完整代码
1.链表结构体的创建
//装节点的的模具
typedef struct list{
int num;
struct list *next;
}list;
2.创建头节点函数,有头有链表
//头节点的初始化(有头有链表)(调用此函数既有头)
list *list_init(void)//创建不需要任何返回参数,需要返回已经创建好的头节点地址
{
list *head = (list *)malloc(sizeof(list));
if(head == NULL)
{
printf("申请内存失败\n");
return NULL;
}
//头节点已经存在,但没数据
head->num=0;
head->next=head;//循环列表的指针指向自己
//返回!返回!
return head;
}
3. 创建新节点
//创建新节点,既将数据放进一个结构体中
list *node_init(int data)//参数为要传入的数据
{
list *node = (list *)malloc(sizeof(list));
if(node == NULL)
{
printf("申请内存失败\n");
return NULL;
}
//数据!数据!
node->num = data;
node->next=NULL;
//返回!返回!
return node;
}
4.展示函数
//展示函数,需要你的head(有头有链表),给你看看就行,不需要返回值
void show_head(list *head)
{
list *p = NULL;//给空值,别自找麻烦
printf("head");
for(p=head->next;p != head;p=p->next)
{
printf("<--%d-->",p->num);
}
printf("head\n");
}
5.用尾插法插入新节点
//尾插
// 需要传入原链表,还有新节点,用指针传入的,插了就插了不需要返回
void insert_tail(list *head,list *node)
{
//建个新指针方便用
list *p = NULL;//初始化,别找麻烦
//先找最后一个节点,别乱插
for(p = head;p->next != head;p=p->next);//冒号不要掉了,找到了就是p
p->next=node;
node->next=head;//别忘了尾巴要指向头
}
6.用头插法插入新节点
//头插
void insert_head(list *head,list *node)
{
list *p = NULL;
p = head;
node->next=p->next;
p->next=node;
}
7.main函数
int main ()
{
list *head = list_init();//调用创建头节点函数,有头节点有链表
list *node = NULL; //用于创建新节点
int data;
printf("请输入链表的每个元素,输入0停止输入:\n");
while(1) //循环输入data,循环调用 node_init(int data)函数,循环调用 insert_tail(list *head,list *node)函数
{
scanf("%d",&data);
if(data == 0)
break;
node = node_init(data);
insert_tail(head,node);//此处用的是尾插
//insert_head(head,node);
show_head(head);
}
return 0;
}
8.完整代码(方便新手小白完成作业,建议用DEV C++编译运行)
#include <stdio.h>
#include <stdlib.h>
//没有装不下
typedef struct list{
int num;
struct list *next;
}list;
//头节点的初始化(有头有链表)(调用此函数既有头)
list *list_init(void)//创建不需要任何返回参数,需要返回已经创建好的头节点地址
{
list *head = (list *)malloc(sizeof(list));
if(head == NULL)
{
printf("申请内存失败\n");
return NULL;
}
//头节点已经存在,但没数据
head->num=0;
head->next=head;//循环列表的指针指向自己
//返回!返回!
return head;
}
//创建新节点,既将数据放进一个结构体中
list *node_init(int data)//参数为要传入的数据
{
list *node = (list *)malloc(sizeof(list));
if(node == NULL)
{
printf("申请内存失败\n");
return NULL;
}
//数据!数据!
node->num = data;
node->next=NULL;
//返回!返回!
return node;
}
//展示函数,需要你的head(有头有链表),给你看看就行,不需要返回值
void show_head(list *head)
{
list *p = NULL;//给空值,别自找麻烦
printf("head");
for(p=head->next;p != head;p=p->next)
{
printf("<--%d-->",p->num);
}
printf("head\n");
}
//尾插
// 需要传入原链表,还有新节点,用指针传入的,插了就插了不需要返回
void insert_tail(list *head,list *node)
{
//建个新指针方便用
list *p = NULL;//初始化,别找麻烦
//先找最后一个节点,别乱插
for(p = head;p->next != head;p=p->next);//冒号不要掉了,找到了就是p
p->next=node;
node->next=head;//别忘了尾巴要指向头
}
//头插
void insert_head(list *head,list *node)
{
list *p = NULL;
p = head;
node->next=p->next;
p->next=node;
}
int main ()
{
list *head = list_init();//调用创建头节点函数,有头节点有链表
list *node = NULL; //用于创建新节点
int data;
printf("请输入链表的每个元素,输入0停止输入:\n");
while(1) //循环输入data,循环调用 node_init(int data)函数,循环调用 insert_tail(list *head,list *node)函数
{
scanf("%d",&data);
if(data == 0)
break;
node = node_init(data);
insert_tail(head,node);//此处用的是尾插
//insert_head(head,node);
show_head(head);
}
return 0;
}