php實現一個單鏈表,PHP鏈表

本文目錄一覽:

PHP實現:如何在只給定單鏈表中某個結點的指針的情況下刪除該結點

p是要刪除的結點,q是p的前一個結點 q-next = p-next;//刪除的結點的後一結點的首地址賦值給刪除的結點的前一結點的next p-next-prior = q;//刪除的結點的後一結點的prior指向刪除的結點的前一結點的首地址

怎樣編寫一個完整的程序,實現單鏈表的建立、插入、刪除、輸出等基本操作?

typedef int Elemtype;

typedef int status;

#define OVERFLOW -2

#define OK 1

#define ERROR -1

#include “stdio.h”

#include “stdlib.h”

typedef struct LNode {

Elemtype data;

struct LNode *next;

}*linklist;

//構造鏈表

void Create_Linklist(linklist L)

{

linklist p;

p=(linklist)malloc(sizeof(LNode));

if(!p)

exit(OVERFLOW);

L=p;

L-next =NULL;

}

//節點插入

void Insert_Linklist(linklist L)

{

linklist p;

int n,i;

printf(“請輸入插入節點的個數n: “);

scanf(“%d”,n);

getchar();

for(i=n;i0;i–)

{

p=(linklist )malloc(sizeof(LNode));

scanf(“%d”,p-data);

p-next=L-next ;

L-next =p;

}

}

//遍歷輸出並輸出長度

status Visit_linklist(linklist L)

{

linklist p;

int i=1;

p=L-next ;

if(L-next==NULL)

return ERROR;

while(p-next !=NULL)

{

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

p=p-next ;

i++;

}

printf(“%d\n”,p-data );

printf(“長度為:%d\n”,i);

return OK;

}

//查找值為x的直接前驅結點q並輸出

void Search_linklist(linklist L)

{

int x,k=0;

linklist p=L,q;

printf(“輸入x: “);

scanf(“%d”,x);

getchar();

if(L-next ==NULL)

printf(“該表為空 !\n”);

while(p-next!=NULL)

{

q=p;

if(p-next -data ==x)

{

printf(“%d “,q-data );

k=1;

}

p=p-next ;

}

if(p-next p-data ==x)

{

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

k=1;

}

if(k==0)

printf(“未找到值為%d的結點\n”,x);

printf(“\n”);

}

//刪除節點

status Delete_linklist(linklist L)

{

linklist p,q;

int k=0,x;

printf(“請輸入刪除節點的值x: “);

scanf(“%d”,x);

getchar();

if(L-next ==NULL)

return ERROR;

p=L;

q=L-next ;

while(q!=NULL)

if(q-data ==x)

{

k=1;

p=q ;

p-next =q-next ;

free(q);

q=p-next ;

}

else

{

p=q ;

q=p-next ;

}

if(k==0)

printf(“表中沒有值為%d的結點!\n”,x);

return OK;

}

//鏈表逆置

void ListInverse_linkliast(linklist L)

{

linklist k,p,q;

p=L;

while (p-next !=NULL)

{

p=p-next ;

}

k=p;

while (L-next !=p)

{

q=L-next ;

L-next = q-next ;

k-next =q;

}

}

//鏈表奇偶分解

void Break_linklist (linklist La,linklist Lb)

{

linklist p,q;

p=La-next;

q=Lb;

while(p-next!=NULL)

{

if(p-data %2==0)

{

q-next =p;

q=q-next ;

}

p=p-next ;

}

if(p-data %2==0)

{

q-next =p;

q=q-next ;

}

}

//主菜單

void main()

{

linklist L1,L2;

printf(” (1) 建立帶頭節點的單鏈表\n”);

printf(” (2) 插入節點\n”);

printf(” (3) 計算鏈表長度並輸出單鏈表\n”);

printf(” (4) 查找值為x的直接前驅結點並輸出其值\n”);

printf(” (5) 刪除節點值為x的結點\n”);

printf(” (6) 逆置單鏈表結點\n”);

printf(” (7) 單鏈表奇偶分解\n”);

int choice;

printf(” 請輸入選擇:”);

while(scanf(“%d”,choice))

{

getchar();

printf(“\n\n”);

switch(choice)

{

case 1:

Create_Linklist(L1);

break;

case 2:

Insert_Linklist(L1);

break;

case 3:

Visit_linklist(L1);

break;

case 4:

Search_linklist(L1);

break;

case 5:

Delete_linklist(L1);

break;

case 6:

ListInverse_linkliast(L1);

break;

case 7:

Create_Linklist(L2);

Break_linklist (L1,L2);

break;

default:

printf(” 輸入有誤!”);

break;

}

}

}

鏈表的實現

首先實現一個單鏈表,代碼如下:

#include iostream

#include stdio.h

#include string.h

#include conio.h

typedef struct student

{

int data;

struct student *next;

}node;

node *creat()

{

node *head,*p,*s;

int x,cycle=1;

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

p=head;

while(cycle)

{

printf(“\nplease input the data: “);

scanf(“%d”,x);

if(x!=0)

{

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

s-data=x;

printf(“\n %d”,s-data);

p-next=s;

p=s;

}

else cycle=0;

}

head=head-next;

p-next=NULL;

printf(“\n yyy %d”,head-data);

return(head);

}

然後增加一個函數對表中的元素逆置,實現如下:

node *reverse(node *head)

{

node *p1,*p2,*p3;

if (head == NULL || head-next == NULL)

return head;

p1 = head, p2 = p1-next;

while (p2)

{

p3 = p2-next;

p2-next = p1;

p1=p2;

p2=p3;

}

head-next = NULL;

head = p1;

return head;

}

以上就是實現對鏈表中的元素置逆的操作的函數了。

編寫程序,建立一個帶有節點的單向鏈表,輸入字元串,並按從小到大順序組織到鏈表中

int main()

{

Link head; //鏈表(不帶頭節點)

int n;

printf(“輸入鏈表的長度n: “);

scanf(“%d”,n);

printf(“連續輸入%d個數據(以空格隔開): “,n);

head=CreateLink(n);

printf(“\n原本鏈表的節點是: “);

DispLink(head);

LinkSort(head);

printf(“\n從大到小排序之後: “);

DispLink(head);

printf(“\n”);

return 0;

}

鏈表的具體存儲表示為:

① 用一組任意的存儲單元來存放線性表的結點(這組存儲單元既可以是連續的,也可以是不連續的)

② 鏈表中結點的邏輯次序和物理次序不一定相同。為了能正確表示結點間的邏輯關係,在存儲每個結點值的同時,還必須存儲指示其後繼結點的地址(或位置)信息(稱為指針(pointer)或鏈(link))

鏈式存儲是最常用的存儲方式之一,它不僅可用來表示線性表,而且可用來表示各種非線性的數據結構。

以上內容參考:百度百科-單鏈表

原創文章,作者:ZCLW,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/147862.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
ZCLW的頭像ZCLW
上一篇 2024-11-02 13:12
下一篇 2024-11-02 13:12

相關推薦

  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • 利用Python實現兩個鏈表合併為一個有序鏈表

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

    編程 2025-04-29
  • PHP怎麼接幣

    想要在自己的網站或應用中接受比特幣等加密貨幣的支付,就需要對該加密貨幣擁有一定的了解,並使用對應的API進行開發。本文將從多個方面詳細闡述如何使用PHP接受加密貨幣的支付。 一、環…

    編程 2025-04-29
  • 使用PHP foreach遍歷有相同屬性的值

    本篇文章將介紹如何使用PHP foreach遍歷具有相同屬性的值,並給出相應的代碼示例。 一、基礎概念 在講解如何使用PHP foreach遍歷有相同屬性的值之前,我們需要先了解幾…

    編程 2025-04-28
  • PHP獲取301跳轉後的地址

    本文將為大家介紹如何使用PHP獲取301跳轉後的地址。301重定向是什麼呢?當我們訪問一個網頁A,但是它已經被遷移到了另一個地址B,此時若伺服器端做了301重定向,那麼你的瀏覽器在…

    編程 2025-04-27
  • PHP登錄頁面代碼實現

    本文將從多個方面詳細闡述如何使用PHP編寫一個簡單的登錄頁面。 1. PHP登錄頁面基本架構 在PHP登錄頁面中,需要包含HTML表單,用戶在表單中輸入賬號密碼等信息,提交表單後服…

    編程 2025-04-27
  • 相交鏈表求節點

    相交鏈表求節點是一個常見的鏈表問題,涉及到判斷兩個鏈表是否相交以及找到相交部分的節點。本文將從鏈表的常見問題、判定相交鏈表、求解相交節點三個方面進行詳細闡述。 一、鏈表的常見問題 …

    編程 2025-04-27
  • Python獲取單鏈表長度的方法

    本文將從以下幾個方面詳細闡述Python中獲取單鏈表長度的方法,並為每個方面提供詳細的代碼示例。 一、定義鏈表 在Python中,我們可以使用類來定義鏈表。具體實現如下: clas…

    編程 2025-04-27
  • PHP與Python的比較

    本文將會對PHP與Python進行比較和對比分析,包括語法特性、優缺點等方面。幫助讀者更好地理解和使用這兩種語言。 一、語法特性 PHP語法特性: <?php // 簡單的P…

    編程 2025-04-27
  • PHP版本管理工具phpenv詳解

    在PHP項目開發過程中,我們可能需要用到不同版本的PHP環境來試驗不同的功能或避免不同版本的兼容性問題。或者我們需要在同一台伺服器上同時運行多個不同版本的PHP語言。但是每次手動安…

    編程 2025-04-24

發表回復

登錄後才能評論