當前位置:首頁 » 編程語言 » 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 06:47:11 瀏覽:824
地平線最高畫質筆記本要什麼配置才能玩 發布:2025-01-12 06:47:10 瀏覽:369
原神過主線任務腳本 發布:2025-01-12 06:34:51 瀏覽:514
醫保電子密碼在哪裡找到 發布:2025-01-12 06:34:38 瀏覽:349
安卓手機有網卻不能使用怎麼辦 發布:2025-01-12 06:25:20 瀏覽:213
arm存儲器映射 發布:2025-01-12 06:25:12 瀏覽:250
安卓系統個人字典有什麼用 發布:2025-01-12 06:13:37 瀏覽:929
geventpython安裝 發布:2025-01-12 06:13:34 瀏覽:339
放鬆解壓助睡眠直播 發布:2025-01-12 06:13:00 瀏覽:829
車載wince和安卓哪個好用 發布:2025-01-12 05:58:18 瀏覽:840