C语言创建单链表如下:
#include"stdio.h"
#include"stdlib.h"
#include"malloc.h"
#include "iostream.h"
typedef struct node
{
int data
node * next
}node , * List
void create(int n)
{
int c
List s,L
L=(List)malloc(sizeof(node))
L->next=NULL
printf("请输入第1个数据:")
scanf("%d",&c)
L->data=c
for(int i=2i<=ni++)
{
s=(List)malloc(sizeof(node))
printf("请输入第%d个数据:",i)
scanf("%d",&c)
s->data=c
s->next=L
L->next =s
}
printf("链表创建成功!")
}
void main()
{
int n
printf("请你输入链表的个数:")
scanf("%d",&n)
create(n)
}
单链表创建方法:
单链表的建立有头插法、尾插法两种方法。
1. 头插法
单链表是用户不断申请 存储单元和改变链接关系而得到的一种特殊 数据结构,将链表的左边称为链头,右边称为链尾。头插法建单链表是将链表右端看成固定的,链表不断向左延伸而得到的。头插法最先得到的是尾结点。
由于链表的长度是随机的,故用一个while循环来控制链表中结点个数。假设每个结点的值都大于O,则循环条件为输入的值大于o。申请 存储空间可使用malloc()函数实现,需设立一申请单元 指针,但malloc()函数得到的指针并不是指向 结构体的指针,需使用 强制类型转换,将其转换成结构体型指针。刚开始时,链表还没建立,是一空链表,head 指针为NULL。
链表建立的过程是申请空间、得到数据、建立链接的循环处理过程。
2. 尾插法
若将链表的左端固定,链表不断向右延伸,这种建立链表的方法称为尾插法。尾插法建立链表时,头 指针固定不动,故必须设立一个搜索指针,向链表右边延伸,则整个算法中应设立三个链表指针,即头指针head、搜索指针p2、申请单元指针pl。尾插法最先得到的是 头结点。
#include<stdio.h>#include<stdlib.h>
//链表定义
typedef int ElemType
typedef struct LNode
{
int data
struct LNode *next
}LNode,*LinkList
/*************************************
* 链表函数 *
*************************************/
//链表初始化
void InitLink(LinkList &L)
//创建函数,尾插法
void CreateLink_T(LinkList &L,int n)
//创建函数,头插法
void CreateLink_H(LinkList &L,int n)
//销毁函数
void DestroyLink(LinkList &L)
//判断是否为空函数
bool EmptyLink(LinkList &L)
//获取函数
bool GetLink(LinkList &L,int i,int &e)
//插入函数
void InsertLink(LinkList &L,int i,int e)
//删除函数
void DeleteLink(LinkList &L,int i,int &e)
//遍历函数
void TraverseLink(LinkList &L)
//链表长度函数
int LengthLink(LinkList &L)
//合并函数
void MergeLink(LinkList &L1,LinkList L2)
void main()
{
LinkList L1,L2
InitLink(L1)
InitLink(L2)
CreateLink_H(L1,2)
CreateLink_T(L2,2)
TraverseLink(L1)
printf("\n")
TraverseLink(L2)
printf("\n")
MergeLink(L1,L2)
TraverseLink(L1)
TraverseLink(L2)
}
//创建函数,尾插法
void InitLink(LinkList &L)
{
L=(LinkList)malloc(sizeof(LNode))
if (!L)
{
printf("Init error\n")
return
}
L->next=NULL
}
void CreateLink_T(LinkList &L,int n)
{
if(n<1)
{
printf("n must >=1\n")
return
}
else
{
// L=(LinkList)malloc(sizeof(LNode))
L->next=NULL
for(int i=0i<ni++)
{
LinkList p=(LinkList)malloc(sizeof(LNode))// the lower letter p
printf("enter the data :\t")
scanf("%d",&(p->data))
p->next=L->next
L->next=p
}
}
}
//创建函数,头插法
void CreateLink_H(LinkList &L,int n)
{
if (n<1)
{
printf("n must >=1\n ")
return
}
else
{
//L=(LinkList)malloc(sizeof(LNode))
LinkList pre=(LinkList)malloc(sizeof(LNode))
L->next=NULL
pre=L
for(int i=0i<ni++)
{
LinkList p=(LinkList)malloc(sizeof(LNode))
printf("enter the data:\t")
scanf("%d",&(p->data))
pre->next=p
pre=p
}
pre->next=NULL
}
}
//销毁函数
void DestroyLink(LinkList &L)
{
LinkList q=L,p=L
while (p)
{
q=p
p=p->next
free(q)
}
L->next=NULL
}
//判断是否为空函数
bool EmptyLink(LinkList &L)
{
if (NULL==L->next)
{
return true
}
else
{
return false
}
}
//获取函数
bool GetLink(LinkList &L,int i,int&e)
{
if (i<1)
{
return false
}
else
{
if (EmptyLink(L))
{
return false
}
LinkList p=L->next
int j=1
while(p&&j<i)
{
p=p->next
j++
}
if (!p||j>i)
{
return false
}
else
{
e=p->data
return true
}
}
}
//插入函数
void InsertLink(LinkList &L,int i,int e)
{
if (i<0||i>LengthLink(L))
{
printf("Insert error\n")
return
}
else
{
LinkList p=L
int j=0
while(p&&(j<i))
{
p=p->next
j++
}
if (!p||j>i)
{
printf("Insert error\n")
return
}
else
{
LinkList q=(LinkList)malloc(sizeof(LNode))
q->data=e
q->next=p->next
p->next=q
}
}
}
//删除函数
void DeleteLink(LinkList &L,int i,int &e)
{
if(i<=0||i>LengthLink(L))
{
printf("delete error\n")
return
}
else
{
LinkList p=L
int j=0
while(p&&j<i-1)
{
p=p->next
j++
}
if(!p||j>i)
{
printf("please enter i again\n")
return
}
else
{
LinkList q=p->next
e=p->next->data
p->next=p->next->next
free(q)
}
}
}
//遍历函数
void TraverseLink(LinkList &L)
{
LinkList p=L->next
if(!p)
{
printf("the Link L is empty\n")
}
while(p)
{
printf("%d\n",p->data)
p=p->next
}
}
//链表长度函数
int LengthLink(LinkList &L)
{
int i=0
LinkList p=L->next
while(p)
{
p=p->next
i++
}
return i
}
//合并函数
void MergeLink(LinkList &L1,LinkList L2)
{
int i=0,flag=0
LinkList p1=L1->next,p2=L2->next
LinkList p=(LinkList)malloc ((LengthLink(L1)+LengthLink(L2)+2)*sizeof(LNode))
LinkList pre=p
if (!p)
{
printf("MergeLink error\n")
return
}
p->next=NULL
while (p1&&p2)
{
if (p1->data>=p2->data)
{
InsertLink(p,i++,p2->data)
p2=p2->next
}
else
{
InsertLink(p,i++,p1->data)
p1=p1->next
}
}
while (p1)
{
InsertLink(p,i++,p1->data)
p1=p1->next
}
while(p2)
{
InsertLink(p,i++,p2->data)
p2=p2->next
}
while(pre)
{
pre=pre->next
}
LinkList q=L1
L1=p
DestroyLink(q)
DestroyLink(L2)
}
*creat a list*/#include "stdlib.h"
#include "stdio.h"
struct list
{ int data
struct list *next
}
typedef struct list node
typedef node *link
void main()
{ link ptr,head
int num,i
ptr=(link)malloc(sizeof(node))
ptr=head
printf("please input 5 numbers==>\n")
for(i=0i<=4i++)
{
scanf("%d",&num)
ptr->data=num
ptr->next=(link)malloc(sizeof(node))
if(i==4) ptr->next=NULL
else ptr=ptr->next
}
ptr=head
while(ptr!=NULL)
{ printf("The value is ==>%d\n",ptr->data)
ptr=ptr->next
}
}
上面是一个简单的创建链表的C程序。所谓链表形象的讲就是一个数据块里面存有数据,并且存有下一个数据的指针,这样一个指一个形成一个数据链。这个数据链可以被操作,例如插入数据,删除数据,等。至于指令,首先定义一个结构体,它存有数据和指向下一个数据块的指针。然后分配空间。注意最后一个为NULL,当然你也可以指向开头一个数据块形成一个循环链表