热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

c语言调用链表,c语言链表的实现

本文目录一览:1、C语言创建链表,函数调用部分

本文目录一览:


  • 1、C语言创建链表,函数调用部分


  • 2、C语言中链表是怎样调用的?


  • 3、用C语言实现链表的算法


  • 4、C语言链表的使用方法


  • 5、链表的使用,c语言


  • 6、C语言链表操作

C语言创建链表,函数调用部分

#includestdio.h

#includewindows.h

#include stdio.h

#include malloc.h

#include stdlib.h

//定义数据类型名称

typedef int DataType;

#define flag -1        //定义数据输入结束的标志数据

//单链表结点存储结构定义

typedef struct Node

{

    DataType data;

    struct Node *next;

}LNode ,*LinkList;

//建立单链表子函数

 LNode *Create_LinkList()

{

    LNode *s,*head,*L;int i=0,x;        //定义指向当前插入元素的指针

    while(1)

    {

        scanf("%d",x);

        if(-1==x)

        {   return head;

            break;}

        s= (LNode *)malloc(sizeof(LNode));        //为当前插入元素的指针分配地址空间

        s-data =x;

        s-next =NULL;

        i++;

        if(i==1)

            head=s;

        else

            L-next =s;

            L=s;

    }

}

//查找子函数(按序号查找)

LNode *Get_LinkList(LinkList L,int i)

{

    LNode *p;

    int j;        //j是计数器,用来判断当前的结点是否是第i个结点

    p=L;

    j=1;

    while(p!=NULLji)

    {

        p=p-next ;        //当前结点p不是第i个且p非空,则p移向下一个结点

        j++;

    }

    return p;

}

//插入运算子函数

void Insert_LinkList(LinkList L,int i,DataType x)        //在单链表L中第i个位置插入值为x的新结点

{

    LNode *p,*s;

    p =Get_LinkList(L,i);        //寻找链表的第i-1个位置结点

    if(p==NULL)

    {

        printf("插入位置不合法!");

        exit(-1);

    }

    else

    {

        s= (LinkList)malloc(sizeof(LNode));        //为当前插入元素的指针分配地址空间

        s-data =x;

        s-next =p-next ;

        p-next =s;

    }

}

//单链表的删除运算子函数

void Delete_LinkList(LinkList L,int i)        //删除单链表上的第i个结点

{

    LNode *p,*q;

    p=Get_LinkList(L,i-1);        //寻找链表的第i-1个位置结点

    if(p==NULL)

    {

        printf("删除的位置不合法!");        //第i个结点的前驱结点不存在,不能执行删除操作

        exit(-1);

    }

    else

    {

        if(p-next ==NULL)

        {

            printf("删除的位置不合法!");        //第i个结点不存在,不能执行删除操作

            exit(-1);

        }

        else

        {

            q=p-next ;

            p-next =p-next-next;

            free(q);

        }

    }

}

//求表长运算子函数

int Length_LinkList(LinkList L)

{

    int l;        //l记录L的表长

    LNode *p;

    p=L;

    l=1;

    while(p-next)

    {

        p=p-next;

        l++;

    }

    return l;

}

int main ()

{

    LNode *head,*p;

    head=(LinkList)malloc(sizeof(LNode));

    int x,y;

    a:

    printf("*******menu*******\n");

    printf("**创建**********1*\n");

    printf("**插入**********2*\n");

    printf("**删除**********3*\n");

    printf("**表长**********4*\n");

    printf("**清屏**********5*\n");

    printf("**打印**********6*\n");

    printf("**退出******other*\n");

    printf("******************\n");

    int i=1;

    while(i)

    {

        printf("请输入选项:");

        scanf("%d",i);

        switch(i)

        {

            case 1:head=Create_LinkList(); getchar();break;

            case 2:printf("请输入位置和数据;");

            scanf("%d%d",x,y);

            Insert_LinkList(head,x,y);break;

            case 3:printf("请输入位置;");

                scanf("%d",x);

                Delete_LinkList(head,x);break;

            case 4:printf("%d",Length_LinkList(head));break;

            case 5:system("cls");goto a;

            case 6:p=head;

        while(p!=NULL)

                {printf("%d\n",p-data);

                p=p-next;}

                break;

            default :i=0;

        }

    }

}

我把创建给改了一下

C语言中链表是怎样调用的?

-运算是间接寻址,你用多指针的话会发现指针用-这种调用方式更简洁

链表指针是C语言的一个难点,但也是重点,学懂了非常有用。要仔细讲就必须先讲变量、指针。

什么是变量?所谓变量,不要浅显的认为会变得量就是变量。举个例子:“教室变不变?”变,因为每天有不同的人在里面上课,但又不变,因为教室始终在那,没有变大或变小。这就是变量:有一个不变的地址和一块可变的存储空间。正常情况下,我们只看到变量这个房间里面的东西,也就是其内容,但不会关注变量的地址,但是C语言的指针,就是这个房间的地址。我们声明变量就相当于盖了间房子存放东西,我们可以直接观看房子里的东西,而声明指针,就是相当于获得了一个定位器,当用指针指向某个变量时,就是用指针给变量定位,以后我们就可以用指针找到他所“跟踪”的变量并可以获得里面的内容。

至于我们写代码的结构体就相当于是有好几个房子组成的别墅,几个房子绑定在一起使用。假设现在有很多这种别墅分布在一个大迷宫里,每间别墅里都有一间房子。里面放了另一个别墅的位置信息,现在你手拿定位器找到了第一栋别墅,从里面得到了你想要的东西(链表的数据部分),然后把下一栋别墅的位置计入你的定位器(p

=

p-next),再走向下一栋别墅……如此走下去,知道走到某地下一栋别墅信息没有了(p-next

==

NULL),你的旅行结束。这就是链表一次遍历的过程。

aTdPage[ucTdPageIndex]-OnInit

();就相当于一个定位器

用C语言实现链表的算法

这个是我们数据结构上机实验的链表问题,

#includestdio.h

#includemalloc.h

#define

LEN

sizeof(LinkNode)

typedef

int

Datatype;

typedef

int

Status;

typedef

struct

LinkNode{

Datatype

data;

struct

LinkNode

*next;

}

LinkNode,*LinkList;

typedef

struct

OrderedList

{

LinkNode

*head,*tail;

int

Listsize;

}

OrderedList;//有序循环链表的头节点head,尾接接节点

tail及长度Listsize

Status

InitList(OrderedList

*List)//生成循环链表头节点

{

List-tail=List-head=(LinkList)malloc(LEN);

if(List-head==NULL)

return

0;

else

{

List-head-next=List-tail;

List-tail-next=List-head;

List-Listsize=0;

return

1;

}

}

void

OrderedInsert(OrderedList

*List,Datatype

data)//每调用一次有序插入data形成有序的(从小到大)的链表

{

LinkNode

*p

,*q;

if(List-head==List-tail-next)

{

p=(LinkNode*)malloc(LEN);

p-data

=

data;

List-head-next=p;

p-next=List-tail;

List-Listsize++;

}

else

{

p=List-head-next;

q

=

List-head;

while(p-datadatap!=List-tail)

{

q

=

p;

p=p-next;

}

if(p-data==data)

{printf("YOu

have

input

the

same

datas

%d\n\t

YOu

should

input

another

data

\n",data);

scanf("%d",data);

OrderedInsert(List,data);

}

else

{

p=(LinkNode*)malloc(LEN);

p-data

=

data;

p-next

=

q-next;

q-next

=

p;

List-Listsize++;

}

}

}

void

Creatset(OrderedList

*List)//多次调用OrderedInsert()生成有序链表即集合List

{

Datatype

data;

int

setsize

,

i=0;

printf("Please

input

the

setsize

you

want

to

creat:\n");

scanf("%d",setsize);

InitList(List);

if(setsize==0)

printf("You

needen't

input

any

data\n");

else

if(setsize==1)

printf("Please

input

a

single

data\n");

else

printf("Please

input

%d

different

datas;\n",setsize);

while(isetsize||setsizeList-Listsize)//当循环次数i小于setsize或者集合内实际元素数List.Listsize小于setsize时一直循环下去

{

scanf("%d",data);

OrderedInsert(List,data);

i++;

}

}

void

Append(OrderedList

*List,Datatype

data)//在循环链表的最后面追加

一个data

{

LinkNode

*p;

p=(LinkNode*)malloc(LEN);

p-data=data;

List-tail=List-tail-next=p;

List-tail-next=List-head;

List-Listsize+=1;

}

void

MergeList(OrderedList

La,OrderedList

Lb,OrderedList

*Lc)//有序循环链表ListLa,ListLb求并集生成ListLc

{

LinkList

Pa,Pb;

Pa=La.head-next;Pb=Lb.head-next;

while(Pa!=La.tailPb!=Lb.tail)

{

if(Pa-data=Pb-data)

{

Append(Lc,Pa-data);

Pa=Pa-next;

}

else

{

Append(Lc,Pb-data);Pb=Pb-next;

}

}

while(Pa!=La.tail)

{

Append(

Lc,Pa-data);Pa=Pa-next;}

while(Pb!=Lb.tail)

{

Append(Lc,Pb-data);Pb=Pb-next;}

}

void

Print(OrderedList

List)

{

LinkNode

*p;

p=List.head-next;

if(p-next==List.head)

printf("No

Elem\n");

while(p!=List.head)

{

printf("%5d",p-data);p=p-next;

}

printf("\n");

}

void

main()

{

OrderedList

ListLa,ListLb,ListLc;

Creatset(ListLa);

Creatset(ListLb);

InitList(ListLc);

MergeList(ListLa,ListLb,ListLc);

printf("The

orgnial

list

ListLa,ListLb:\n");

Print(ListLa);

Print(ListLb);

printf("The

Merge

list

ListLc;\n");

Print(ListLc);

}

C语言链表的使用方法

下面的程序是单链表的建立与输出,都有详细的注释,相信你能看的懂

但要想学习链表必须得掌握了一定的C语言基础

下面这个链表的作用是建立5个结点的单链表,5个结点的值输入以后,依次输出各个结点的值

#includestdio.h

#includestdlib.h

//链表的建立与输出

struct node//定义结点的类型

{

int num,score;

node*link;

};

void main()

{

node*creat(int n);//函数原型声明

void print(node*h);//函数原型声明

node*head=0;//定义链头指针并初始化

head=creat(5);//调用creat函数创建链表

print(head);//调用print函数输出链表

}

node*creat(int n)

{

node*h=0,*p,*q;

int i;

for(i=1;i=n;i++)

{

q=(node*)malloc(sizeof(node));//分配一个结点空间

scanf("%d%d",q-num,q-score);//输入新结点的值

q-link=0;//新结点的指针域置0

if(h==0)

h=q;//第一个结点作为链头结点

else

p-link=q;//新结点添加到链表的末尾

p=q;

}

return h;//返回链头指针

}

void print(node*h)//链表输出函数的定义

{

while(h)//当指针h非空时输出h所指结点的值

{

printf("num=%d\tscore=%d\n",h-num,h-score);

h=h-link;//使h指向下一个结点

}

}

链表的使用,c语言

#includestdio.h

#includestdlib.h

typedef struct Node

{

 int data;

 struct Node*next;

}node,*Llist;

Llist creat(int n)

{

 int i;

 Llist head,p,q;

    head=(node*)malloc(sizeof(node));

 p=q=head;

 head-next=NULL;

 for(i=0;in;i++)

 {

  p=(node*)malloc(sizeof(node));

  scanf("%d",p-data);

  p-next=q-next;

  q-next=p;

  q=p;

 }

 return head;

}//建立链表函数//

int main()

{

 Llist la,lb,lc;

 node *p,*q,*r;

 int m,n;

 printf("请分别输入A与B链表的长度:");

 scanf("%d%d",m,n);

 printf("请输入A链表的数据(递增):");

 la=creat(m);

    printf("请输入B链表的数据(递增):");

 lb=creat(n);

 q=la;

 p=la-next;

 r=lb-next;

 while(p!=NULLr!=NULL)

 {

  if((p-data)==(r-data))

  {

   q-next=p-next;

   free(p);

   p=q-next;

   r=r-next;

  }//当两值相等时均向后移动一位,并释放A中相等结点//

  else if((p-data)(r-data))

  {

   q=p;

   p=p-next;

  }//a链表中结点小于b时,a向后移动一位//

  else

   r=r-next;//b链表中结点小于a时,b向后移动一位//

 }

 lc=la;

 p=lc-next;

 printf("A-B的结果为:");

 while(p!=NULL)

 {

  printf("%d ",p-data);

  p=p-next;

 }

 return 0;

}

C语言链表操作

typedefstruct_List{intdata;struct_List*next;}List;intQuery(List**head,intx){List*p=(*head)-next;intn=1;while(pp-data!=x){p=p-next;n++;}if(p)returnn;elsereturn-1;}


推荐阅读
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 本文介绍了一道网络流题目hdu4888 Redraw Beautiful Drawings的解题思路。题目要求以行和列作为结点建图,并通过最大流算法判断是否有解以及是否唯一。文章详细介绍了建图和算法的过程,并强调在dfs过程中要进行回溯。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
author-avatar
突击手丶罪域
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有