如何C语言创建单链表

最好有注释... 最好有注释 展开
 我来答
小甜甜爱亮亮
高粉答主

2018-04-12 · 说的都是干货,快来关注
知道大有可为答主
回答量:689
采纳率:98%
帮助的人:22万
展开全部

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=2;i<=n;i++)

{

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。尾插法最先得到的是 头结点。

折柳成萌
高粉答主

2017-09-21 · 繁杂信息太多,你要学会辨别
知道顶级答主
回答量:4.4万
采纳率:96%
帮助的人:6371万
展开全部
#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()
{
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
珠檬印久么醉堡2a
2017-06-18 · TA获得超过481个赞
知道小有建树答主
回答量:627
采纳率:66%
帮助的人:70.4万
展开全部
1、创建节点的结构体类型,里面要有一个指向此类型结构的指针。2、建立一个头指针,一个尾指针3、每次有新节点进入链表时,用malloc分配空间,然后用链表尾端的节点指针指向新节点,新节点的指针指向NULL。这只是个大概的流程,如果看不懂,可以看一下数据结构相关的书
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
kngl520
2017-09-20
知道答主
回答量:2
采纳率:0%
帮助的人:1889
展开全部

wdwqeqeqds

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
我是真的少校
2014-12-05 · TA获得超过1318个赞
知道小有建树答主
回答量:460
采纳率:60%
帮助的人:271万
展开全部

#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=0;i<n;i++)

  {

  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=0;i<n;i++)

{

           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);


}


本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 3条折叠回答
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式