當前位置:首頁 » 編程語言 » c語言鏈表申請新結點
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言鏈表申請新結點

發布時間: 2022-06-14 02:18:24

⑴ 求助:如何用c語言創建一個自定義鏈表類型的頭結點

Linklist head=(Linklist)malloc(sizeof(ListNode));這句話要在函數里用(main等),因為在編譯時不能確定head的值,這好像涉及編譯原理的內容,應該有警告,但可以運行

⑵ C語言 創建帶頭結點的鏈表

單鏈表的生成有2種方式:頭插法和尾插法。
1、頭插法
/*********************************************************************
* 函數名稱:linklist *CreateLinklistHead()
* 函數功能:利用頭插法創建鏈表
* 參 數:無
* 返 回 值:創建完鏈表後的鏈表頭結點
* 說 明:無
*********************************************************************/
extern linklist *CreateLinklistHead()
{
int x, i, nodeNum;
linklist *head, *temp; // 頭結點與臨時結點
head = (linklist *)malloc(sizeof(linklist)); // 生成表頭結點
head->next = NULL; // 給表頭結點的指針域賦值
printf("請輸入鏈表中結點的個數:");
scanf("%d", &nodeNum);
for(i=1; i<=nodeNum; i++)
{
printf("請輸入第 %d 個結點的數據:", i);
scanf("%d", &x);
temp = (linklist *)malloc(sizeof(linklist)); // 生成新的結點
temp->data = x; // 對新結點的數據域賦值
// 將新結點插到頭結點之後
temp->next = head->next;
head->next = temp;
}
return head; // 返回新建鏈表的頭結點
}2、尾插法
/*********************************************************************
* 函數名稱:linklist *CreateLinklistRear()
* 函數功能:利用尾插法創建鏈表
* 參 數:無
* 返 回 值:創建完鏈表後的鏈表頭結點
* 說 明:無
*********************************************************************/
extern linklist *CreateLinklistRear()
{
int x, i, nodeNum;
linklist *head, *rear, *temp; // 定義頭結點、尾結點和臨時結點
head = (linklist *)malloc(sizeof(linklist)); // 生成表頭結點,表頭結點不存放數據
head->next = NULL; // 將表頭結點的指針域賦值為NULL
rear = head; // 將表頭結點賦值給表尾結點
printf("請輸入鏈表中結點的個數:");
scanf("%d", &nodeNum);
for(i=1; i<=nodeNum; i++)
{
printf("請輸入第 %d 個結點的數據:", i);
scanf("%d", &x);
temp = (linklist *)malloc(sizeof(linklist)); // 生成新的結點
temp->data = x; // 新增結點的數據域
temp->next = NULL; // 新增結點的指針域(由於是尾插法,所以插入的結點都在尾部,即指針域為NULL)
rear->next = temp; // 使前一個結點指向新增結點(head->next=temp)
rear = temp; // 將新增結點賦值給尾結點(尾插法,插入的結點在尾部)(rear=head->next)
}
//rear->next = NULL; // 將尾結點的指針域賦值為空(為了方便檢驗鏈表是否為空鏈表)
return head; // 返回頭結點
}

⑶ C語言單鏈表怎麼插入節點

#include"sll_node.h"
#include<stdlib.h>

#defineFALSE0
#defineTRUE1

//insertNode2:把newValue的值插入到遞增排序的鏈表中,正確返回TRUE,錯誤返回FALSE
//nextp是指向當前節點的指針,最初是頭指針
intinsertNode2(Node**nextp,intnewValue)
{
Node*newNode;//新節點指針
Node*current;//當前節點指針

current=*nextp;//最初當前節點為nextp指針指向的節點
//查找新插入節點的位置
while(current!=NULL&&current->value<newValue)
{
nextp=¤t->next;
current=current->next;
}

//為新節點分配內存
newNode=(Node*)malloc(sizeof(Node));
if(newNode==NULL)
returnFALSE;
newNode->value=newValue;

//統一了插入的步驟。即:每次插入,都是前一個指針指向新節點,新節點指向下一個節點
*nextp=newNode;
newNode->next=current;

returnTRUE;
}

main函數
[cpp]viewplain
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include"sll_node.h"

intinsertNode(Node**rootp,intnewValue);
intinsertNode2(Node**nextp,intnewValue);

intmain()
{
srand(time(0));

Node*head=(Node*)malloc(sizeof(Node));
head->next=NULL;

for(inti=0;i<5;i++)
{
inttemp=rand()%50;
printf("%d ",temp);
//insertNode(&head,temp);
insertNode2(&head,temp);
}

Node*p=head->next;
while(p!=NULL)
{
printf("%d ",p->value);
p=p->next;
}

getchar();
getchar();
return0;
}

⑷ c語言鏈表怎麼通過節點數據查找節點進行插入或更改;

說一下一個大概的思路,首先定義兩個指針,一個指針用來向前移動(叫當前指針),另一個指針緊跟其後(叫前驅指針),這個主要用於鏈表的增刪,判斷是否要刪除當前指針指向的節點,或者增加節點。如果需要刪除當前節點,則前驅指針的下一個節點指向當前指針的下一個節點,釋放當前指針指向的節點,然後當前指針指向前驅指針的下一個節點,增加也是一樣的,一直這樣遍歷整個鏈表。至於修改節點數據,那麼需要一個當前指針就夠了,找到要修改的節點,修改就好了。

閑著沒事干,剛寫了代碼,給你參考一下:


//刪除節點
voiddelete_node_credit(floatconstcredit){

stu*pre_node=head;
stu*cur_node=head->next;

while(cur_node){

if(cur_node->credit==credit){

pre_node->next=cur_node->next;
free(cur_node);
cur_node=pre_node->next;
}else{

pre_node=cur_node;
cur_node=cur_node->next;
}
}
//判斷是否刪除頭節點
if(head->credit==credit){

cur_node=head->next;
free(head);
head=cur_node;
}
}
//新增節點
voidinsert_node_credit(stu*new_node,floatconstcredit){

stu*pre_node=head;
stu*cur_node=head->next;

if(pre_node->credit>credit){//新增節點是頭節點

head=new_node;
new_node->next=pre_node;
return;
}
while(cur_node){

if(cur_node->credit<credit&&pre_node->credit>credit){

pre_node->next=new_node;//插入新的節點
new_node->next=cur_node;
return;
}
pre_node=cur_node;
cur_node=cur_node->next;
}
//新增節點插入鏈表尾部
if(pre_node->credit<credit){

pre_node->next=new_node;
return;
}
}

下面是運行結果

如果你看理解了這個思路,那麼鏈表的增刪查改操作就沒有問題了。有用的話點一下採納,謝謝!!!

⑸ C語言  動態鏈表新申請節點的指針域 是否默認指向NULL

何謂指針域?
struct
Node(
int
n;
Node*
next;
//指針域???
}
這里的next可以指向任何地址,隨你怎麼指都可以。(當然,默認建議設為NULL)如果不設的就是所謂的
野指針
,你不訪問時沒錯,一旦訪問野指針的話後果難以預料。

⑹ c語言鏈表多次插入新節點的問題

前面的都沒什麼問題,問題在insert函數中。首先當頭指針為空的情況下也就是if(b==null)只要把插入的節點加上就是你下面的b=s3;s3->next=null;而後面的部分則不執行,改成下面這樣:
if(b==null)
{ b=s3;s3->next=null;}
else
{

……
}
還有我不明白(s4->num!=s1->num)你這里判斷這兩個相等和s1->next!=null有什麼用,你講下你想做什麼,好幫你改

⑺ c語言鏈表插入一個新節點的函數問題

首先,主函數中,「請輸入插入的數據」那裡scanf應該是&b,這是引發崩潰的原因。

其次,insert函數的目的應該是想插入數據後仍是有序鏈表。但你的insert函數邏輯太亂,有些不必要的判斷,我修正了你的代碼,貼給你看看。(雖然你insert是想保證有序,但你在創建的時候沒有保證有序,所以最終結果不一定是有序。例如,創建 1,5,2,插入3,最後輸出的是 1,3,5,2)

代碼修改:

  1. scanf("%d", &b);

  2. 重寫了insert函數,簡化邏輯;

  3. 動態分配的內存記得釋放,增加freeNode釋放空間

#include<stdio.h>
#include<stdlib.h>
structlink
{
intdata;
structlink*next;
};
structlink*add(structlink*head);//創建鏈表
voiddisplay(structlink*head);//輸出數據
structlink*insert(structlink*head,intb);//插入新節點
voidfreeNode(structlink*); //釋放空間
intmain()
{
charc;
structlink*head=NULL;
printf("要創建一個鏈表嗎?");
scanf("%c",&c);
while(c=='y'||c=='Y')
{
head=add(head);
printf("要繼續創建節點嗎?");
scanf("%c",&c);
}
display(head);
intb;
printf("輸入插入的數據");
scanf("%d",&b);
head=insert(head,b);
display(head);
freeNode(head);
}
structlink*add(structlink*head)
{
intdata;
structlink*p=(structlink*)malloc(sizeof(structlink));
if(head==NULL)
{
head=p;
}
else
{
structlink*pr=head;//一個臨時指針pr先保存下head的地址
while(pr->next!=NULL)
{
pr=pr->next;
}
pr->next=p;
}
printf("輸入數據");
scanf("%d",&p->data);
p->next=NULL;
returnhead;
}
voiddisplay(structlink*head)
{
structlink*pr=head;
while(pr!=NULL)
{
printf("%d ",pr->data);
pr=pr->next;
}
}
structlink*insert(structlink*head,intb)
{
structlink*ptr=head,*prev=head;
structlink*newNode=(structlink*)malloc(sizeof(structlink));
newNode->data=b;
while(ptr&&b>ptr->data){
prev=ptr;
ptr=ptr->next;
}
newNode->next=ptr;
if(ptr==head) head=newNode;
else prev->next=newNode;

returnhead;
}

voidfreeNode(structlink*node){
if(!node) return;
freeNode(node->next);
free(node);
}

⑻ c語言編程的問題: 要見一個動態鏈表 然後任意插入一個結點 怎麼做啊

單鏈表操作很簡單的,
插入操作如下:
1.
創建一個新節點並分配空間
pt
2.
移動到要插入的節點
p1
3.
新節點->next=p1->next
將新節點指向當前的節點的下一個節點
4.
p1->next=pt
將當前節點指向新節點

⑼ C語言,關於單鏈表插入結點問題,求大蝦解答

node=(linklist)malloc(sizeof(len);//創建一個新的結點node
node->next=temp->next;//給node的指針域賦值temp的指針域所儲存的地址,賦值之後的結果相當於node指向temp的下一個結點
temp->next=node;//之後,temp的指針域存放node結點的地址,相當於temp指向node。
//這樣就成功的在temp後插入node這個結點了。

⑽ 單鏈表怎樣插入一個結點c語言

如果已知一個節點指針pre和一個節點指針cur,要把cur插入到pre節點之後,很顯然要保證鏈表不會斷開而丟失後面的節點,要先把後面的節點指針(指向lat的指針)保存下來,即有cur->next = pre->next,然後把cur連接的一串鏈表連接到pre後面,即pre->next = cur;

上面介紹了,在一個節點之後插入節點的情況。這是通常的情況。如果要向一個鏈表的頭部插入節點,就只需要將新節點的下一個指針指向鏈表的頭指針即可。

在這種情況下,有兩點要注意:

1,鏈表是否為空鏈表

2,要插入的節點是不是空指針。

代碼實現:

//向單鏈表中插入一個節點(插入在鏈開始處)
//輸入參數:單鏈表的頭指針和要插入的節點指針
//輸出參數:無
//返回值:指向單鏈表的頭指針
SingleList* Insert(SingleList *head,SingleList *node)
{
if(node == NULL)
{
return head;
}
else if(head == NULL)
{
return node;
}

node->next = head;
head = node;
return head;
}