当前位置:首页 » 编程语言 » php实现链表

php实现链表

发布时间: 2022-11-12 12:14:12

‘壹’ l数据结构~~双链表的实现

双链表
1、双向链表(Doubly
Linked
List)
双(向)链表中有两条方向不同的链,即每个结点中除next域存放后继结点地址外,还增加一个指向其直接前趋的指针域prior。
注意:
①双链表由头指针head惟一确定的。
②带头结点的双链表的某些运算变得方便。
③将头结点和尾结点链接起来,为双(向)循环链表。
2、双向链表的结点结构和形式描述
①结点结构(见上图a)
②形式描述
typedef
struct
dlistnode{
DataType
data;
struct
dlistnode
*prior,*next;
}DListNode;
typedef
DListNode
*DLinkList;
DLinkList
head;
3、双向链表的前插和删除本结点操作
刻画双链表结构的对称性的语句:p→prior→next==
p→next→prior;由于双链表的对称性,在双链表能能方便地完成各种插入、删除操作。
①双链表的前插操作
void
DInsertBefore(DListNode
*p,DataType
x)
{//在带头结点的双链表中,将值为x的新结点插入*p之前,设p≠NULL
DListNode
*s=malloc(sizeof(DListNode));//①
s->data=x;//②
s->prior=p->prior;//③
s->next=p;//④
p->prior->next=s;//⑤
p->prior=s;//⑥
}
②双链表上删除结点*p自身的操作
void
DDeleteNode(DListNode
*p)
{//在带头结点的双链表中,删除结点*p,设*p为非终端结点
p->prior->next=p->next;//①
p->next->prior=p->prior;//②
free(p);//③
}
注意:
与单链表上的插入和删除操作不同的是,在双链表中插入和删除必须同时修改两个方向上的指针。
上述两个算法的时间复杂度均为O(1)。

‘贰’ 实现一个链表操作

#include<fstream.h>
#include<process.h>
#include<iomanip.h>
#include<string.h>
const char*file_name="stuinfo.txt";

class Student
{
public:
Student();
~Student();
void add_info();//添加学生信息
void del_info();//删除学生信息
void search_info_name();//通过学生名字来查找信息
void search_info_Snum();//通过学号来查找信息
void out_all_info();//输出所有学生的信息
void creat_file();//创建文件,学生的信息保存在文件里,即使退出了程序,下次运行还可以找到学生的信息
int get_info();//从文件中获取学生的信息
int search_file();//判断是否存在一个保存学生信息的文件
protected:
char name[10];//学生名字最长为10个字符
long Snum;//学号是长整行
int Chinese,English,Math,Computer;//语文 英语 数学 计算机 共四门课
Student *head,*next;//创建链表使用的指针
};

/**
*构造函数,用来创建对象同时初始化相关指针变量
*/
Student::Student()
{
head=NULL;
next=NULL;
}

/**
*判断是否存在一个保存学生信息的文件
*/
int Student::search_file()
{
ifstream input_file;
input_file.open(file_name);
if(!input_file)//不存在文件
return 0;
else
input_file.close();//存在文件
return 1;
}

/**
*从文件中获取学生的信息
*/
int Student::get_info()
{
Student *temp,*loop;
temp=new Student();
loop=new Student();
ifstream out_file;
out_file.open(file_name,ios::beg);//打开文件,设置读指针在文件的开头
if(!out_file)//打开文件失败
{
cout<<"Fail to get information from the file!";
cout<<"\nPress any key to exit.";
cin.get();
exit(0);//结束程序
}
while(!out_file.eof())//循环读文件,直到读到了文件的末尾
{
//文件的结构是:文件的一行就是一个学生的信息, 从左到右是:学号 姓名 语文 英语 数学 计算机
//这些信息可以在本程序提供的功能生成并保存到文件里
out_file>>(temp->Snum)>>(temp->name)>>(temp->Chinese)>>(temp->English)>>(temp->Math)>>(temp->Computer);
if(temp->Snum==0) break;
//使用链表把学生的信息保存到内存中
if(head==NULL) head=temp;
else
{
if(head->Snum>temp->Snum)
{
temp->next=head;
head=temp;
}
else
{
loop=head;
while(loop->next!=NULL)
{
if(loop->next->Snum>temp->Snum)
{
temp->next=loop->next;
loop->next=temp;
break;
}
loop=loop->next;
}
if(loop->next==NULL)
{
loop->next=temp;
temp->next=NULL;
}
}
}
temp=new Student;
loop=new Student;
}
out_file.close();//关闭文件
if(head==NULL) return 0;
else return 1;
}

/**
*创建文件,可以增加学生的信息
*/
void Student::creat_file()
{
Student *temp,*loop;
temp=new Student;
loop=new Student;
ofstream creat_file;
creat_file.open(file_name,ios::beg);
if(!creat_file)
{
cout<<"Fail to creat stdent information file!";
cout<<"\nPress any key to exit.";
cin.get();
exit(0);
}
cout<<"-----------------------------------------------------------"<<endl;
cout<<"Now creat file of student information."<<endl;
cout<<"Input the number of the student (0 to end):";
cin>>temp->Snum;//输入学号
while(temp->Snum!=0)//学号不为0
{
cout<<"Input the name of the student:";
cin>>temp->name;//姓名
cout<<"Input the score of Chinese:";
cin>>temp->Chinese;//语文
cout<<"Input the score of English:";
cin>>temp->English;//英语
cout<<"Input the score of Math:";
cin>>temp->Math;//数学
cout<<"Input the score of Computer Science:";
cin>>temp->Computer;//计算机
creat_file<<temp->Snum<<" "<<temp->name<<" "<<temp->Chinese<<" "<<temp->English<<" "<<temp->Math<<" "<<temp->Computer<<endl;
temp=new Student;
loop=new Student;
cout<<"\n\nInput the number of the student (0 to end):";
cin>>temp->Snum;//输入学号
}
creat_file<<0;
creat_file.close();
}
/**
*输出所有学生的信息
*/
void Student::out_all_info()
{
Student*temp;
temp=new Student;
cout<<"-----------------------------------------------------------"<<endl;
cout<<"The flowing is the information of the students."<<endl<<endl;
cout<<"Snum"<<setw(9)<<"name"<<setw(9)<<"Chinese"<<setw(9)<<"English"<<setw(9)
<<"Math"<<setw(18)<<"Coputer Science"<<endl;
temp=head;
while(temp!=NULL)//循环读链表,输出所有学生的信息
{
cout<<(temp->Snum)<<setw(9)<<(temp->name)<<setw(9)<<(temp->Chinese)<<setw(9)<<(temp->English)
<<setw(9)<<(temp->Math)<<setw(12)<<(temp->Computer)<<endl;
temp=temp->next;
}
}
/**
*通过姓名查找信息
*/
void Student::search_info_name()
{
Student *temp;
char name[10];
temp=new Student;
cout<<"-----------------------------------------------------------"<<endl;
cout<<"Input the name of the student you want to search:";
cin>>name;//输入姓名
temp=head;
while(temp!=NULL&&strcmp(temp->name,name)!=0)//在链表中逐个的比较姓名
temp=temp->next;
if(temp==NULL)//没有找到信息,就是说找不到需要查找姓名的学生的信息
cout<<"Sorry,no such student of the name you input!"<<endl;
else//输出学生的信息
{
cout<<"The flowing is the information of the student "<<name<<endl;
cout<<"Snum"<<setw(9)<<"name"<<setw(9)<<"Chinese"<<setw(9)<<"English"<<setw(9)
<<"Math"<<setw(18)<<"Coputer Science"<<endl;
cout<<(temp->Snum)<<setw(9)<<(temp->name)<<setw(9)<<(temp->Chinese)<<setw(9)<<(temp->English)
<<setw(9)<<(temp->Math)<<setw(12)<<(temp->Computer)<<endl;
}
}
/**
*通过学号查找信息
*/
void Student::search_info_Snum()
{
Student*temp;
long num;
temp=new Student;
cout<<"---------------------------------------------------------"<<endl;
cout<<"Input the number of the student you want to search:";
cin>>num;//输入学号
temp=head;
while(temp!=NULL&&temp->Snum!=num)//比较学号
temp=temp->next;
if(temp==NULL)//没有找到信息
cout<<"Sorry,no such student of the number you input!"<<endl;
else//输出信息
{
cout<<"The flowing is the information of the student "<<num<<endl;
cout<<"Snum"<<setw(9)<<"name"<<setw(9)<<"Chinese"<<setw(9)<<"English"<<setw(9)
<<"Math"<<setw(18)<<"Coputer Science"<<endl;
cout<<(temp->Snum)<<setw(9)<<(temp->name)<<setw(9)<<(temp->Chinese)<<setw(9)<<(temp->English)
<<setw(9)<<(temp->Math)<<setw(12)<<(temp->Computer)<<endl;
}
}
/**
*增加学生的信息
*/
void Student::add_info()
{
Student *temp,*loop,*loop1;
temp=new Student;
loop=new Student;
loop1=new Student;
cout<<"-----------------------------------------------------------"<<endl;
cout<<"Now add information of student."<<endl;
cout<<"Input the number of the student (0 to end):";
cin>>temp->Snum;//输入学号
loop1=temp;
while(temp->Snum!=0)//学号不为0
{
cout<<"Input the name of the student:";
cin>>temp->name;//姓名
cout<<"Input the score of Chinese:";
cin>>temp->Chinese;//语文
cout<<"Input the score of English:";
cin>>temp->English;//英语
cout<<"Input the score of Math:";
cin>>temp->Math;//数学
cout<<"Input the score of Computer Science:";
cin>>temp->Computer;//计算机
if(head==NULL) head=temp;//将信息添加到链表中
else
{
if(head->Snum>temp->Snum)
{
temp->next=head;
head=temp;
}
else
{
loop=head;
while(loop->next!=NULL)
{
if(loop->next->Snum>temp->Snum)
{
temp->next=loop->next;
loop->next=temp;
break;
}
loop=loop->next;
}
if(loop->next==NULL)
{
loop->next=temp;
temp->next=NULL;
}
}
}
temp=new Student;
loop=new Student;
cout<<"\n\nInput the number of the student (0 to end):";
cin>>temp->Snum;
}
cout<<"\nThe information you input is the flowing."<<endl;
cout<<"Snum"<<setw(9)<<"name"<<setw(9)<<"Chinese"<<setw(9)<<"English"<<setw(9)
<<"Math"<<setw(18)<<"Coputer Science"<<endl;
while(loop1!=NULL)
{
cout<<(loop1->Snum)<<setw(9)<<(loop1->name)<<setw(9)<<(loop1->Chinese)<<setw(9)<<(loop1->English)
<<setw(9)<<(loop1->Math)<<setw(12)<<(loop1->Computer)<<endl;
loop1=loop1->next;
}

}
/**
*通过学号删除信息
*/
void Student::del_info()
{
Student *temp,*loop1,*loop2;
long snum;
temp=new Student;
loop1=new Student;
loop2=new Student;
cout<<"----------------------------------------------------------"<<endl;
cout<<"Input the number of the student you want to delete:";
cin>>snum;//输入学号
temp=head;
while(temp!=NULL&&temp->Snum!=snum)//通过学号查找信息
{
loop1=temp;
temp=temp->next;
}
if(temp==NULL)//没有相应学号的学生信息
cout<<"Sorry,no such student of the number you input!"<<endl;
else
{
loop1->next=temp->next;//跳过链表的一个节点temp
cout<<"The information you delete is the flowing."<<endl;
cout<<"Snum"<<setw(9)<<"name"<<setw(9)<<"Chinese"<<setw(9)<<"English"<<setw(9)
<<"Math"<<setw(18)<<"Coputer Science"<<endl;
cout<<(temp->Snum)<<setw(9)<<(temp->name)<<setw(9)<<(temp->Chinese)<<setw(9)<<(temp->English)
<<setw(9)<<(temp->Math)<<setw(12)<<(temp->Computer)<<endl;
if(temp->Snum==head->Snum) head=head->next;
delete temp;//删除节点
}
}
/**
*析构函数,只用程序的正常结束才会执行改函数,并且把学生的信息保存到文件中
*/
Student::~Student()
{
Student*temp;
temp=new Student;
ofstream write_file;
write_file.open(file_name,ios::beg);
if(!write_file)
{
cout<<"Fail to write the information to the file!"<<endl;
cout<<"Press any key to exit.";
cin.get();
exit(0);
}
temp=head;
while(temp!=NULL)
{
write_file<<temp->Snum<<" "<<temp->name<<" "<<temp->Chinese<<" "<<temp->English<<" "<<temp->Math<<" "<<temp->Computer<<endl;
temp=temp->next;
}
write_file<<0;
write_file.close();
}
/**
*主函数,主要提供一些菜单选项
*/
void main()
{
char select;
int selection;
Student student;
cout<<"\n########################################################"<<endl;
if(student.search_file()==0)
{
cout<<"There is no file of student information."<<endl;
cout<<"Do you want to creat it?(Y/N):";
cin>>select;
if(select=='Y'||select=='y')
student.creat_file();
else
exit(0);
}
if(student.get_info()==0)
{
cout<<"There is no information in the file"<<endl;
cout<<"Do you want to add information to the file?(Y/N):";
cin>>select;
if(select=='y'||select=='Y')
student.add_info();
else exit(0);
}
cout<<"\n\n##########################################################"<<endl;
cout<<"Information of students.Selections are flowing."<<endl;
cout<<"Input number 1 to search information by name."<<endl;
cout<<"Input number 2 to search information by number."<<endl;
cout<<"Input number 3 to add nuw information to the file."<<endl;
cout<<"Input number 4 to delete information from the file."<<endl;
cout<<"Input number 5 to view all the students' information."<<endl;
cout<<"Input other numbers to exit."<<endl;
cout<<"Input your selection please:";
cin>>selection;
while(selection>=1&&selection<=5)
{
if(selection==1) student.search_info_name();
if(selection==2) student.search_info_Snum();
if(selection==3) student.add_info();
if(selection==4) student.del_info();
if(selection==5) student.out_all_info();
cout<<"\n\n########################################################"<<endl;
cout<<"Information of students.Selections are flowing."<<endl;
cout<<"Input number 1 to search information by name."<<endl;
cout<<"Input number 2 to search information by number."<<endl;
cout<<"Input number 3 to add nuw information to the file."<<endl;
cout<<"Input number 4 to delete information from the file."<<endl;
cout<<"Input number 5 to view all the students' information."<<endl;
cout<<"Input other numbers to exit."<<endl;
cout<<"Input your selection please:";
cin>>selection;
}
}

‘叁’ php在服务器端如何建立链表保存用户信息

你可以以文件的形式保存
也就是用户上传了信息,把这些信息生成一个html性质的文件保存到某个目录文件中,文件以会员ID命名,这个目录最好是按当天日期命名,如果用户要读取的话直接显示这个文件里边的内容就行了。
然后用户退出后删除这个文件,有些用户是直接关浏览器的,就不会执行退出删除文件的操作,这样会遗留一些文件在目录中,所以定期清除这个用户信息目录下的文件,如果是按照日期命名的,把不是当天的日期目录删除就行;

‘肆’ PHP如何取得数组的上标和下标

获取下标:$array=array('a'=>1,'b'=>3,'c'=>4);$a=array_keys($array);echo end($a)。

PHP的加密函数有crypt()、 md5() 和sha1() 这3种, 其中crypt() 用于单向加密, 所谓的单向加密就是将需要加密的内容进行加密之后, 无法将密文转换成为可读的内容。

因此单向加密的应用范围较狭窄, 一般用于用户名认证和密码输入等情况; 当用户进入系统时,只需要将密文口令输 入,经过系统验证与存储的口令一致, 即可通过。

(4)php实现链表扩展阅读:

主要特点:

(一)开源性和免费性

由于PHP的解释器的源代码是公开的,所以安全系数较高的网站可以自己更改PHP的解释程序。另外,PHP 运行环境的使用也是免费的。

(二)快捷性

PHP是一种非常容易学习和使用的一门语言,它的语法特点类似于C语言,但又没有C语言复杂的地址操作,而且又加入了面向对象的概念,再加上它具有简洁的语法规则,使得它操作编辑非常简单,实用性很强。

(三)数据库连接的广泛性

PHP可以与很多主流的数据库建立起连接,如MySQL、ODBC、Oracle等,PHP是利用编译的不同函数与这些数据库建立起连接的,PHPLIB就是常用的为一般事务提供的基库。

‘伍’ php不支持指针,怎么实现单向链表

你可以参照java实现的方法,在类里自包含一个类,呵呵
------解决方案--------------------

‘陆’ 深入PHP中的HashTable结构详解

深入PHP中的HashTable结构详解

深入PHP中的HashTable结构详解

对php内核有一定了解的人应该都知道php的精髓就是HashTable,HashTable在php的实现中无处不在。包括php的数组、什么全局变量、局部变量的作用域等等,php的hashtable拆开来说就是四部分:

hash函数:用的是time33的散列函数,将一个字符串的key转换成一个数字

一个C数组:用来储存桶(buckets)的

两个双向的链表:第一个双向链表是数组的每个元素(桶bucket)是一个双向链表,这样做是为了解决hash冲突;第二个双向链表是数组将每一个桶(bucket)连接起来,这里要连接的也就是第一个双向链表的链表头,这样做是为了遍历整个hash表用的,鸟哥有篇blog是讲php的foreach的,这里这样设计就是给foreach用的==>《深入理解PHP之数组(遍历顺序)》

我这里不再说hashtable的struct和bucket的`struct了,因为下面的推荐链接几乎都讲了,我不觉得我能描述和说的比他们好,每个人的水平不一样,我就以我现在的技术水平来描述,所以我就只把我整理的一些东西记录一下

下面是php中hash实现的两个文件:zend_hash.c zend_hash.h。这两个文件里面实现了一堆的api,也引申出了一堆的api,下面是实现出来的api的原型

复制代码 代码如下:

ZEND_API ulong zend_hash_func(const char *arKey, uint nKeyLength)

ZEND_API ulong zend_get_hash_value(const char *arKey, uint nKeyLength)

ZEND_API int _zend_hash_init(HashTable *ht, uint nSize, hash_func_t pHashFunction, dtor_func_t pDestructor, zend_bool persistent ZEND_FILE_LINE_DC)

ZEND_API void zend_hash_set_apply_protection(HashTable *ht, zend_bool bApplyProtection)

ZEND_API int _zend_hash_add_or_update(HashTable *ht, const char *arKey, uint nKeyLength, void *pData, uint nDataSize, void **pDest, int flag ZEND_FILE_LINE_DC)

ZEND_API int _zend_hash_quick_add_or_update(HashTable *ht, const char *arKey, uint nKeyLength, ulong h, void *pData, uint nDataSize, void **pDest, int flag ZEND_FILE_LINE_DC)

ZEND_API int _zend_hash_index_update_or_next_(HashTable *ht, ulong h, void *pData, uint nDataSize, void **pDest, int flag ZEND_FILE_LINE_DC)

ZEND_API int zend_hash_rehash(HashTable *ht)

static int zend_hash_do_resize(HashTable *ht)

ZEND_API int zend_hash_del_key_or_index(HashTable *ht, const char *arKey, uint nKeyLength, ulong h, int flag)

ZEND_API void zend_hash_destroy(HashTable *ht)

ZEND_API void zend_hash_clean(HashTable *ht)

static Bucket *zend_hash_apply_r(HashTable *ht, Bucket *p)

ZEND_API void zend_hash_graceful_destroy(HashTable *ht)

ZEND_API void zend_hash_graceful_reverse_destroy(HashTable *ht)

ZEND_API void zend_hash_apply(HashTable *ht, apply_func_t apply_func TSRMLS_DC)

ZEND_API void zend_hash_apply_with_argument(HashTable *ht, apply_func_arg_t apply_func, void *argument TSRMLS_DC)

ZEND_API void zend_hash_apply_with_arguments(HashTable *ht TSRMLS_DC, apply_func_args_t apply_func, int num_args, …)

ZEND_API void zend_hash_reverse_apply(HashTable *ht, apply_func_t apply_func TSRMLS_DC)

ZEND_API void zend_hash_(HashTable *target, HashTable *source, _ctor_func_t pCopyConstructor, void *tmp, uint size)

ZEND_API void _zend_hash_merge(HashTable *target, HashTable *source, _ctor_func_t pCopyConstructor, void *tmp, uint size, int overwrite ZEND_FILE_LINE_DC)

static zend_bool zend_hash_replace_checker_wrapper(HashTable *target, void *source_data, Bucket *p, void *pParam, merge_checker_func_t merge_checker_func)

ZEND_API void zend_hash_merge_ex(HashTable *target, HashTable *source, _ctor_func_t pCopyConstructor, uint size, merge_checker_func_t pMergeSource, void *pParam)

ZEND_API int zend_hash_find(const HashTable *ht, const char *arKey, uint nKeyLength, void **pData)

ZEND_API int zend_hash_quick_find(const HashTable *ht, const char *arKey, uint nKeyLength, ulong h, void **pData)

ZEND_API int zend_hash_exists(const HashTable *ht, const char *arKey, uint nKeyLength)

ZEND_API int zend_hash_quick_exists(const HashTable *ht, const char *arKey, uint nKeyLength, ulong h)

ZEND_API int zend_hash_index_find(const HashTable *ht, ulong h, void **pData)

ZEND_API int zend_hash_index_exists(const HashTable *ht, ulong h)

ZEND_API int zend_hash_num_elements(const HashTable *ht)

ZEND_API int zend_hash_get_pointer(const HashTable *ht, HashPointer *ptr)

ZEND_API int zend_hash_set_pointer(HashTable *ht, const HashPointer *ptr)

ZEND_API void zend_hash_internal_pointer_reset_ex(HashTable *ht, HashPosition *pos)

ZEND_API void zend_hash_internal_pointer_end_ex(HashTable *ht, HashPosition *pos)

ZEND_API int zend_hash_move_forward_ex(HashTable *ht, HashPosition *pos)

ZEND_API int zend_hash_move_backwards_ex(HashTable *ht, HashPosition *pos)

ZEND_API int zend_hash_get_current_key_ex(const HashTable *ht, char **str_index, uint *str_length, ulong *num_index, zend_bool plicate, HashPosition *pos)

ZEND_API int zend_hash_get_current_key_type_ex(HashTable *ht, HashPosition *pos)

ZEND_API int zend_hash_get_current_data_ex(HashTable *ht, void **pData, HashPosition *pos)

ZEND_API int zend_hash_update_current_key_ex(HashTable *ht, int key_type, const char *str_index, uint str_length, ulong num_index, int mode, HashPosition *pos)

ZEND_API int zend_hash_sort(HashTable *ht, sort_func_t sort_func, compare_func_t compar, int renumber TSRMLS_DC)

ZEND_API int zend_hash_compare(HashTable *ht1, HashTable *ht2, compare_func_t compar, zend_bool ordered TSRMLS_DC)

ZEND_API int zend_hash_minmax(const HashTable *ht, compare_func_t compar, int flag, void **pData TSRMLS_DC)

ZEND_API ulong zend_hash_next_free_element(const HashTable *ht)

void zend_hash_display_pListTail(const HashTable *ht)

void zend_hash_display(const HashTable *ht)

;

‘柒’ PHP判断链表是否有环

判断是否带环:用快慢指针。快指针每走两步,慢指针走一步,如果两者在某个点处相。

遇,则链表带环。

下边给出函数的实现代码:

typedef struct LinkNode{DataType data;struct LinkNode *next;}LinkNode,*pLinkNode;typedef struct LinkList{LinkNode *pHead;}LinkList,*pLinkList;pLinkNode isCircle(pLinkList plist){assert(plist);if (NULL == plist->pHead){printf("链表为空 ");return NULL;}pLinkNode fast = plist->pHead;pLinkNode slow = plist->pHead;while (fast && fast->next){fast = fast->next->next;slow = slow->next;if (fast == slow)return fast;}return NULL;}


如果

如果链表带环,看下边的图:

代码:

pLinkNode firstCrossNode(pLinkList plist){assert(plist);if (NULL == plist->pHead){printf("链表是空 ");return NULL;}pLinkNode ret = isCircle(plist);if (ret == NULL){printf("链表不带环 ");return NULL;}pLinkNode fast = plist->pHead;pLinkNode slow = ret;while (fast){fast = fast->next;slow = slow->next;if (fast == slow)return fast;}}

‘捌’ 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;i>0;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;
}
}
}

‘拾’ php如何判断循环链表

可以用宽度为二或三的二维数组来代替,如一个5行3列的数组A[5,3]来做双循环。
A[0,0]保存元素值,A[0,1]指向数组尾,A[0,2]指向下一个元素。....A[i,0]保存元素值,A[i,1]指向上一个元素,A[i,2]指向下一个元素....A[4,0]保存元素值,A[4,1]指向上一个元素,A[4,2]指向数组头。利用数组长度判断当前位置,这样就形成了一个双循环(单循环就去掉一列,指向一个方向就可以了)。

其实就是数据结构的知识。

热点内容
脚本函数未定义 发布:2025-01-12 09:39:44 浏览:634
页面PHP 发布:2025-01-12 09:38:07 浏览:200
邮政银行打电话登录密码是什么 发布:2025-01-12 09:37:27 浏览:563
linuxroot远程登录 发布:2025-01-12 09:37:26 浏览:302
怎么算服务器ip 发布:2025-01-12 08:59:19 浏览:854
安卓与ios哪个适合做主力机 发布:2025-01-12 08:54:11 浏览:340
微软怎么关闭配置更新 发布:2025-01-12 08:34:23 浏览:316
wifi的有限的访问权限 发布:2025-01-12 08:34:14 浏览:609
cftp文件重命名 发布:2025-01-12 08:33:27 浏览:881
https的加密算法 发布:2025-01-12 08:19:15 浏览:654