您的位置:

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

链式存储是最常用的存储方式之一,它不仅可用来表示线性表,而且可用来表示各种非线性的数据结构。

以上内容参考:百度百科-单链表