c語言調用鏈表,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;}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/271708.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-16 19:23
下一篇 2024-12-16 19:23

相關推薦

  • 利用Python實現兩個鏈表合併為一個有序鏈表

    對於開發工程師來說,實現兩個鏈表合併為一個有序鏈表是必須掌握的技能之一。Python語言在鏈表處理上非常便利,本文將從多個方面詳細闡述如何利用Python實現兩個鏈表合併為一個有序…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28
  • Python作為中心語言,在編程中取代C語言的優勢和挑戰

    Python一直以其簡單易懂的語法和高效的編碼環境而著名。然而,它最近的發展趨勢表明Python的使用範圍已經從腳本語言擴展到了從Web應用到機器學習等廣泛的開發領域。與此同時,C…

    編程 2025-04-28

發表回復

登錄後才能評論