C语言如何创建单链表?

Python06

C语言如何创建单链表?,第1张

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,当然你也可以指向开头一个数据块形成一个循环链表