㈠ 數據結構中的鏈表是不是可以存放不同類型的數據 int型char型之類的 還是只能存放同一種類型的元素
要看你建的是什麼類型的表了 要是你typedef的是整型的表那就只能放整形的數據 double float這些就不行 但是要是你用結構體定義裡麵包括不同的類型也是可以的 比如說你要建個學生姓名和成績的鏈表就可以這樣
typedef struct data{
int num;
char name[20];
float score[M];
} data; //定義學生資料結構體
typedef struct stu{
data student;
struct stu *next;
}stu,*LinkList; //定義鏈表頭結點
然後再建立這個結構體的鏈表
L=(LinkList)malloc(sizeof(stu));
if(!L)
return 0; //異常處理
L->next=NULL; //建立帶頭結點的單鏈表
下面接著輸入學生資料函數就可以了 這樣也就是可以同時輸入不同類型數據了
我沒打全 不知道明白沒.....我覺得說的挺亂.............
㈡ 已知單鏈表L中的數據元素類型為整型,設計演算法刪除所有偶數
遍歷L中的所以元素,查詢是否為偶數,是則刪除,刪除元素前先把前一個元素的next指針指向後一個元素,由於是L是單鏈表 ,所以查詢元素時需要定義兩個指針變數,一個用來存儲當前元素的地址一個用來存儲前一個元素的地址,如果不用兩個指針來就不知道前一個元素的地址了.我這里只是說了方法而已,具體編程還需要看你具體題目,如果可以的話,附上題目,我幫你做了
㈢ iOS - 鏈表
鏈表最基本的結構是在每個節點保存數據到下一個節點的地址,在最後一個節點保存一個特殊的結束標記。另外在一個固定的位置保存指向第一個節點的指針,有的時候也會同時儲存指向最後一個節點的指針。但是也可以提前把一個節點的位置另外保存起來,然後直接訪問,當然如果只是訪問數據就沒必要了,不如在鏈表上出錯指向實際數據的指針。這樣一般是為了訪問鏈表中下一個或者前一個節點
優勢 :
可以克服數組鏈表需要預先知道數據大小的缺點,鏈表結構可以充分利用計算機內存空間,實現靈活的內存動態管理
鏈表最明顯的好處是,常規數組排列關聯項目的方式可能不同於這些數據項目在記憶體或磁碟上順序,數組的存取往往要在不同的排列順序中轉換。而列表是一種自我指示數據類型,因為它包含指向另一個相同類型的數據的指針(鏈接),同時,鏈表允許插入和移除表上任意位置上的節點.
劣勢 :
鏈表由於增加了節點的指針域,空間開銷比較大;另外,鏈表失去了數組隨機讀取的優點,一般查找一個節點的時候需要從第一個節點開始每次訪問下一個節點,一直訪問到需要的位置
鏈表中最簡單的一種是單向鏈表
一個單向鏈表的節點被分成兩個部分,它包含兩個域,一個信息域和一個指針域,第一個部分保存或者顯示關於節點的信息,第二個節點存儲下一個節點的地址,而最後一個節點則指向一個空值。單向鏈表只可向一個方向遍歷
單鏈表有一個頭節點 head ,指向鏈表在內存的首地址,鏈表中的每一個節點的數據類型為結構體類型,節點有兩個成員:整型成員(實際需要保存的數據)和指向下一個結構體類型節點的指針即下一個節點的地址(事實上,此單鏈表是用於存放整型數據的動態數組)。鏈表按此結構對各節點的訪問需從鏈表的頭找起,後續節點的地址由當前節點給出。無論在表中訪問哪一個節點,都需要從鏈表的頭開始,順序向後查找。鏈表的尾節點由於無後續節點,其指針域為空,寫作為NULL
上圖還給出這樣一層含義,鏈表中的各節點在內存的存儲地址不是連續的,其各節點的地址是在需要時向系統申請分配的,系統根據內存當前的情況,即可以連續的分配地址,也可以跳躍式分配地址
單向列表程序的實現
在鏈表節點的定義中,除一個整形的成員外,成員 next 是指向與節點類型完全相同的指針
在鏈表節點的數據結構中,非常特殊的一點就是結構體內的指針域的數據類型使用了未定義成功的數據類型。 這是C中唯一規定可以先使用後定義的數據結構
創建一個存放正整數單鏈表,輸入0或小於0的數,結束創建鏈表,並列印鏈表中的
在鏈表的創建過程中,鏈表的頭指針是非常重要的參數,因為對鏈表的輸出和查找都要從鏈表的頭開始,所以鏈表創建成功後,要返回一個鏈表節點的地址,即頭指針
程序執行流程:
雙向鏈表其實是單向鏈表的改進,當我們對單鏈表進行操作時,有時你要對某個節點的直接前驅進行操作時,又必須從表頭開始查找。這是由單鏈表節點的結構所限制的,因為單鏈表每個節點只有一個存儲直接後繼節點地址的鏈域,那麼能不能定義一個既有存儲直接後繼節點地址的鏈域,又有存儲直接前驅節點地址的鏈域的這樣一個雙鏈節點結構呢? 這就是雙向鏈表
在雙向鏈表中,節點除含有數據域外,還有兩個鏈域,一個存儲直接後繼節點地址,一般稱為右鏈域(當此"連接"為最後一個"連接"時,指向空值或空列表);一個存儲直接前驅節點地址,稱為左鏈域(當此"連接"為第一個"連接"時,指向空值或空列表)
雙向鏈表節點定義
當然,也可以把一個雙向鏈表構成一個雙向循環鏈表。
雙向列表與單向鏈表一樣,也有三種基本運算:查找、插入和刪除
循環鏈表是與單向鏈表一樣,是一種鏈式的存儲結構,所不同的是,循環鏈表的最後一個節點的指針是指向該循環鏈表的第一個節點或者頭節點,從而構成一個環形的鏈
循環鏈表的運算與單鏈表的運算基本一致,所不同的有以下幾點:
塊狀鏈表本身是一個鏈表,但是鏈表存儲的不是一般的數據,而是由這些數據組成的順序表。每一個塊狀鏈表的節點,也就是順序表,可以被叫做一個塊
塊狀鏈表另一個特點是相對於普通鏈表來說節省內存,因為不用保存指向每一個數據節點的指針
參考: ios -鏈表的簡單認識
㈣ 1>構造一個鏈表,每個結點存儲的是整型數據。 如:(2,4,6,8,10,12,14,16,18,20) <2
#include<iostream.h>
structnode{
intdata;
structnode*next;
};
node*createlist(){/*以上是構造一個鏈表*/
node*u,*p,*head;
intx;
head=newnode;
head->data=0;
p=head;
while(x!=0){
cout<<"請輸入數據(0結束輸入過程):";
cin>>x;
if(x==0)break;
u=newnode;
u->data=x;
u->next=NULL;
p->next=u;
p=u;
}
returnhead;
}
voiddisplist(node*L){
inti=0;
node*p=L->next;
while(p!=NULL){
if(i%10==0)cout<<endl;
cout<<p->data<<"";
p=p->next;
i++;
}
}
intlist_length(node*L){//求表的長度
intcount=0;
node*p=L->next;
while(p!=NULL){
count++;
p=p->next;
}
return(count);
}
voidtraversal(node*L){//輸出連表中的值
if(!L)return;
node*p=L->next;
while(p){
cout<<p->data<<"";
p=p->next;
}
}
voidlist_insert(node*L,inti,intx){//在指定位置插入結點
node*s,*p=L->next;
intk=0;
while((k!=i-1)&&(p!=NULL)){
p=p->next;
k++;
}
if(p==NULL)cout<<"序號錯。"<<endl;
else{
s=newnode;
s->data=x;
s->next=p->next;
p->next=s;
}
}
voidlist_delete(node*L,inti){//刪除結點
node*u,*p=L;
intk=0;
while((k!=i-1)&&(p!=NULL)){
p=p->next;
k++;
}
if((p==NULL)||(p->next==NULL))cout<<"刪除序號錯。"<<endl;
else{
u=p->next;
p->next=u->next;
deleteu;
}
}
voidlist_insertincrease(node*L,intx){//在增序表中插入結點
node*u,*p=L;
while((p->next!=NULL)&&(p->next->data<x))p=p->next;
u=newnode;
u->data=x;
u->next=p->next;
p->next=u;
}
voidmain(){
// intx,i;
node*head;
head=createlist();
cout<<"顯示鏈表:"<<endl;
displist(head);
cout<<"插入數據36後:"<<endl;
list_insert(head,2,36);
displist(head);
cout<<"刪除結點2後:"<<endl;
list_delete(head,2);
displist(head);
}