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

发布时间:2022-11-23

本文目录一览:

  1. C语言创建链表,函数调用部分
  2. C语言中链表是怎样调用的?
  3. 用C语言实现链表的算法
  4. C语言链表的使用方法
  5. 链表的使用,c语言
  6. C语言链表操作

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

#include<stdio.h>
#include<windows.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!=NULL&&j<i)
    {
        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语言实现链表的算法

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

#include<stdio.h>
#include<malloc.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->data<data&&p!=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(i<setsize||setsize<List->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.tail&&Pb!=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个结点的值输入以后,依次输出各个结点的值

#include<stdio.h>
#include<stdlib.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语言

#include<stdio.h>
#include<stdlib.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;i<n;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!=NULL&&r!=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语言链表操作

typedef struct _List{
    int data;
    struct _List *next;
}List;
int Query(List **head, int x)
{
    List *p = (*head)->next;
    int n = 1;
    while(p && p->data != x)
    {
        p = p->next;
        n++;
    }
    if(p)
        return n;
    else
        return -1;
}