導航:首頁 > 源碼編譯 > 後插法創建單鏈表演算法

後插法創建單鏈表演算法

發布時間:2022-06-30 22:01:03

1. 創建一個帶頭結點的單鏈表,分別用前插法和後插法創建單鏈表。這個怎麼弄

#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
int val;
struct node *next;
}NODE;

NODE *create_linklist(int len,int *a)
{
int i;
NODE *p = (NODE *)malloc(sizeof(NODE));
NODE *head = p;
NODE *q = NULL;

for (i = 0; i < len; ++i){
q = (NODE *)malloc(sizeof(NODE));
q->val = *(a+i);
p->next = q;
p = q;
}
p->next = NULL;

return head;
}

NODE *find_in_linklist(NODE *pnode,int val)
{
NODE *p = NULL;
if (!pnode->next){
return NULL;
}

p = pnode->next;
while(p){
if(val == p->val){
return p;
}
p = p->next;
}

return NULL;
}

int delete_node(NODE *pnode,NODE *pdel)
{
NODE *p = pnode->next;
NODE *q = pnode;

while(p){
if (p == pdel){
q->next = p->next;
free(p);
return 1;
}
p = p->next;
q = q->next;
}

return 0;
}

void print_linklist(NODE *pnode){
NODE *p = pnode->next;

while(p){
printf("%d ", p->val);
p = p->next;
}
printf("\n");
}

int main(int argc, char const *argv[])
{
/* code */
int a[] = {1,2,3,5};
NODE *p = create_linklist(4,a);
NODE *q = find_in_linklist(p,2);

print_linklist(p);

if(q){
if(delete_node(p,q)){
printf("delete successful!\n");
}
else{
printf("delete failed!\n");
}
}

print_linklist(p);
return 0;
}

2. 建立單鏈表的尾插法的編程思路是什麼

建立鏈表時不僅使用頭指針,還要另外使用一個尾結點指針,每次插入的結點成為當前尾結點的後繼結點(也就是成為新表尾結點),並且尾結點指針也要後移,指向新插入的尾結點
其實鏈隊列就是這樣插入(入隊)的

3. 從表頭插入節點建立單鏈表的演算法如何寫

何在指針q指向的結點後面插入結點。該過程的步驟如下:
(1)先創建一個新結點,並用指針p指向該結點。
(2)將q指向的結點的next域的值(即q的後繼結點的指針)賦值給p指向結點的next域。
(3)將p的值賦值給q的next域。
通過以上3步就可以實現在鏈表中由指針q指向的結點後面插入p所指向的結點。可以通過圖1-5形象地展示出這一過程。
圖1-5
向鏈表插入結點過程
下面給出代碼描述:
1.void
insertList(LinkList
*list,LinkList
q,ElemType
e)
/*當鏈表為空時*/
10.
else
16.}
上面的這段代碼描述了如何在指針q指向的結點後面插入結點的過程。其過程包括以下幾步。
(1)首先生成一個新的結點,大小為sizeof(LNode),用LinkList類型的變數p指向該結點。將該結點的數據域賦值為e。
(2)接下來判斷鏈表是否為空。如果鏈表為空,則將p賦值給list,p的next域的值置為空。否則,將q指向的結點的next域的值賦值給p指向結點的next域,這樣p指向的結點就與q指向結點的下一個結點連接到了一起。
(3)然後再將p的值賦值給q所指結點的next域,這樣就將p指向的結點插入到了指針q指向結點的後面。
其實通過上面這段演算法描述可以看出,應用這個演算法同樣可以創建一個鏈表。這是因為當最開始時鏈表為空,即list==NULL,該演算法可自動為鏈表創建一個結點。在下面的創建其他結點的過程中,只要始終將指針q指向鏈表的最後一個結點,就可以創建出一個
鏈表。
注意:函數insertList()的參數中有一個LinkList
*list,它是指向LinkList類型的指針變數,相當於指向LNode類型的指針的指針。這是因為在函數中要對list,也就是表頭指針進行修改,而調用該函數時,實參是&list,而不是list。因此必須採取指針參數傳遞的辦法,否則無法在被調函數中修改主函數中定義的變數的內容。以下的代碼也有類似的情況。

4. 如何創建單鏈表

建立單鏈表的常用方法有兩種:頭插法建表、尾插法建表

5. 尾插法建立單鏈表問題,c/c++

首先,r和head都是ListNode對象,你調用r=head的時候,實際上是調用了ListNode的默認復制構造函數,此時默認復制構造函數僅僅作一個指針值的復制,並沒有重新分配內存空間,也就是說,r此時並沒有用malloc申請空間,r和head指向同一地址空間,此後,你在r之後插入新節點,比如插入第一個節點,這個節點是跟在r之後的,但r又和head同一指向,也就是相當在head後面插入一個節點,之後,r移向新插入的節點上,而head不變,仍然指向剛開始的地方(此時head後面已經有一個節點了),實際上r就是一個跟蹤指針,為了建立鏈表後,你能夠獲得該鏈表的首地址,你必須保存head的值,也就是說不能改變head的值!如果不明白,你也可以找些有關「深復制」和「淺復制」的書看看!(面向對象構造函數應該會講到)

6. 尾插法建立兩個單鏈表,並設計演算法將兩個鏈表合並(C++語言)

建立一個鏈表:
[code=#include<iostream.h>

struct link

{ int data; //元素類型

link *next; //指針類型,存放下一個元素地址

};

link *rcreat( )//尾插法建立鏈表

{

link *s,*r,*p;

int i;

p=r=new link;

p->next=NULL;

cin>>i;

while(i)

{ s=new link;

s->data=i;

r->next=s;
r=s;
cin>>i;

}

r->next=NULL;

return p;

}C/C++][/code]

7. 用尾插法生成一個帶頭結點的單鏈表

首先,你是C還是C++語言,決定你用malloc函數還是new運算符來動態開辟結點。
其次,要設置指針,p1作為新開辟結點,p2指向尾結點。每次開辟一個新節點,就讓當前尾結點的next域指向新結點,新結點的next置空,然後讓p2重新定位到p1位置,新結點作為尾結點。這是尾插法建表。
再次,如果查找Key值,
k ←key;
for (p3=head;p3!=p2;p3++)
if p3→key == k
then ....↓....

注意,這里找到結點了,就要先把此結點前驅的尾指針指向此節點的後繼,然後free或者delete就可以了,你如果想要具體的源代碼,那麼請參考

C程序設計,第四版,清華大學出版社,譚浩強,習題解答小冊上,第十二章結構體和共同體中,關於鏈表的簡單4個操作,
或者是C++程序設計,清華大學出版社,譚浩強,第八章面向過程程序設計,習題解答小冊上也有C++版本的單鏈表處理。

如果你要能編譯的源代碼來交作業,請查閱上述兩本書,絕對有。
如果你是為了學好C或者C++,請認真打扎實基本功。

8. 尾插法建立單鏈表時遇到的的問題

沒看出來這兩個演算法之間有什麼大的區別
主要區別就是 LNode* 類型變數 s 的聲明位置

方法一是在函數首部聲明,生命周期是從函數調用開始到函數返回位置
方法二是在for循環內部聲明,生命周期是在for循環的循環體內部,要說效率看起來好像低了點,因為好像每次循環都要為他分配空間.

9. 如何C語言創建單鏈表

C語言創建單鏈表如下:

#include"stdio.h"

#include"stdlib.h"

#include"malloc.h"

#include "iostream.h"

typedef struct node

{

intdata;

node * next;

}node , * List;

void create(int n)

{

int c;

List s,L;

L=(List)malloc(sizeof(node));

L->next=NULL;

printf("請輸入第1個數據:");

scanf("%d",&c);

L->data=c;

for(int i=2;i<=n;i++)

{

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

printf("請輸入第%d個數據:",i);

scanf("%d",&c);

s->data=c;

s->next=L;

L->next =s;

}

printf("鏈表創建成功!");

}

void main()

{

int n;

printf("請你輸入鏈表的個數:");

scanf("%d",&n);

create(n);

}

10. 數據結構單鏈表的建立(後插法)

new(head)
head->next=NULL
tail=head
while (read(x)!=EOF)
{
new(a)
a->value=x
tail->next=a
a->next=NULL
tail=a
}

大概如此。

閱讀全文

與後插法創建單鏈表演算法相關的資料

熱點內容
安卓app如何不顯示圖標 瀏覽:524
桌面雲伺服器組建配置 瀏覽:923
濟寧織夢源碼怎麼跳轉到qq 瀏覽:290
西安java培訓 瀏覽:298
蘋果用戶app如何退款 瀏覽:889
解壓方式就是喝酒 瀏覽:396
麥塊怎麼添加到游戲伺服器 瀏覽:962
噴油螺桿製冷壓縮機 瀏覽:581
python員工信息登記表 瀏覽:377
高中美術pdf 瀏覽:161
java實現排列 瀏覽:513
javavector的用法 瀏覽:982
osi實現加密的三層 瀏覽:233
大眾寶來原廠中控如何安裝app 瀏覽:916
linux內核根文件系統 瀏覽:243
3d的命令面板不見了 瀏覽:526
武漢理工大學伺服器ip地址 瀏覽:149
亞馬遜雲伺服器登錄 瀏覽:525
安卓手機如何進行文件處理 瀏覽:71
mysql執行系統命令 瀏覽:930