转载:https://blog.csdn.net/huangjiaaaaa/article/details/104389013
C语言单链表
1、单链表定义
链表是通过一组任意的存储单元来存储线性表中的数据元素,
这些存储单元可以是连续的也可以是不连续的。
为了建立起数据元素之间的关系,对于每个数据元素除了存放数据元素自身的信息外,还必须有包含的指示该元素直接后继元素存储位置的信息,这两部分信息组成一个结点,即每个结点都有至少包括两个域,一个域存储数据元素信息,称为数据域,另一个域存储直接后继的地址,称为指针域。那么顾名思义,单链表即每个结点只有一个指针域。
单链表分为有带头结点和不带头结点的单链表
带头结点的单链表,头指针head指向头结点,头结点的值域不包含任何信息,从头结点之后的结点开始存储信息。看个人编程习惯决定使用哪一种单链表。
不带头结点的单链表
带头结点的单链表
2、头插法建单链表
下面用代码完成:用头插法将“I love program”放至链表中,并输出验证结果。
#include <stdio.h>
//程序名称:头插法建单链表
//程序功能:用头插的方法建立、输出、释放单链表。
//代码编写者:黄
//时间:2019
#include <stdio.h>
#include <stdlib.h>
//定义全局变量MAX为14
#define MAX 14
struct list //描述节点
{
char string;
struct list *next;
};
typedef struct list node;
typedef node *link;
char string[MAX]={'I',' ','l','o','v','e',' ','p','r','o','g','r','a','m'}; //数据库
link create_list(link head) //头插法建表
{
link newpointer;
char ch;
int i;
head=(link)malloc(sizeof(node));//动态内存分配函数,大小为一个node结构体的大小
if(head==NULL)//判断是否分配成功
printf("exit\n");
else
{
head->string=string[0];//将数据库的第一个数据赋给头指针的数据域
head->next=NULL;//指针域置空
//将剩余的数据赋值
for(i=1;i<MAX;i++)
{
newpointer=(link)malloc(sizeof(node));
if(newpointer==NULL)
printf("exit\n");
else
{
newpointer->string=string[i];//头插法的精髓
newpointer->next=head;
head=newpointer;
}
}
}
return head;//重:返回头指针
}
void printf_list(link head) //定义打印链表函数
{
link temp;
temp=head;
while(temp!=NULL)
{
printf("%c",temp->string);
temp=temp->next;
}
}
void free_list(link head) //定义一个释放链表函数
{
link temp;
while(head!=NULL)
{
temp=head;
head=head->next;
free(temp);
}
}
int main()
{
link head;
head = create_list(head);
if(head!=NULL)
{
printf_list(head);
free_list(head);
}
printf("\n");
return 0;
}
输出
3、尾插法建单链表
下面用代码完成:用尾插法将“I love program”放至链表中,并输出验证结果。
#include <stdio.h>
//程序名称:尾插法建单链表
//程序功能:用尾插的方法建立、输出、释放单链表。
//代码编写者:黄
//时间:2019
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//定义全局变量MAX为14
#define MAX 14
struct list //描述节点
{
char string;
struct list *next;
};
typedef struct list node;
typedef node* link;
char string[MAX]={'I',' ','l','o','v','e',' ','p','r','o','g','r','a','m'};//数据库
link create_list(link head) //尾插法建表
{
link pointer,newpointer;
int i;
head=(link)malloc(sizeof(node));//动态分配内存
if(head==NULL)//判断是否分配成功
printf("exit\n");
else
{
head->string=string[0];
head->next=NULL;
pointer=head;
for(i=1;i<MAX;i++)
{
newpointer=(link)malloc(sizeof(node));
if(newpointer==NULL)
printf("exit\n");
else
{
newpointer->string=string[i];//尾插法的精髓
newpointer->next=NULL;
pointer->next=newpointer;
pointer=newpointer;
}
}
}
return head;
}
void printf_list(link head) //定义打印列表函数
{
link temp;
temp=head;
while(temp!=NULL)
{
printf("%c",temp->string);
temp=temp->next;
}
}
void free_list(link head) //定义一个释放链表函数
{
link temp;
while(head!=NULL)
{
temp=head;
head=head->next;
free(temp);
}
}
int main()
{
link head;
head=create_list(head);
if(head!=NULL)
{
printf_list(head);
free_list(head);
}
printf("\n");
return 0;
}
输出