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
}
大概如此。