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

c語言單鏈表修改節點

發布時間: 2023-03-24 10:32:48

1. 求教c語言大神 如何交換單向鏈表的節點

交換鏈表結點,實質通常是交換結點結構體中除next指針以外的內容。傳統、正宗和時效較高的方法是交換結點的關系指針而不交換其他成員。一個結點有自己的指針和指向下一個結點的指針,「自己的指針」就是上一結點的next指針,所以要交換上一結點的next指針和本級的next指針兩個指針;而且由於頭結點、尾結點的關系指針與中間結點的有所不同,所以遇到與頭結點和尾結點交換時處理上與中間結點略有差異。所以操作起來比較麻煩,關系處理不好就會出錯。另一個辦法是對應交換除next指針以鏈慎茄外的所有成員,思路很清晰,就是代碼較長,在結點成員較多時更為明顯,書寫就比較煩瑣。有一個既保證思路清晰又書寫方便的辦法是「整體交換需要交換的兩個結點,再把next指孝顫針交換回來」。我時常用這種辦法。但別看代碼讀起來順順當當,也短淺,可別指望這能提高時效——因為交換結構體變數時,盡管書寫很簡短,其實還是一個成員對一個成棚察員地進行交換的,何況還多了個「把next指針交換回來」的操作。屬個人體會,供參考。

2. C語言單鏈表節點

單鏈表的頭插入:
L是頭結點,
p是插入結點,
假設:
鏈表結構為
L->A->B...
L->next=NULL; // 這條語吵野句有問題, 頭結點插入是不需要這句的, 否則.p->next=L->next就都等於null了;
p->next=L->next; //p的下個結點指向頭結點L的下個結點A, 即:p的下個結點指向原第2個結點A
L->next=p; // 頭結點L的下個結點指向p, 即將p插入到L的後面
// 最終結果為:L->P->A->B...---------------------------------------
單鏈表的尾插入:L是尾結點,p是插入結點,r為標記末尾結點
假設:
鏈表結構為
..A->B->L
L->next=NULL;//末尾結點沒有下個結點, 即next指向null
r=L; // r標記末尾結漏宴點
p->next=NULL; // p待插入的末尾結點, 同樣沒有下升搜喊個結點, next指向null
r->next=p; // 將末尾結點r的下個結點指向p, 即:L下個結點指向p
r=p; // 將r重新指向新的末尾結點p
//最終結果:A->B->L->P

3. C語言中鏈表怎麼刪除結點

有分才有動力啊哥們。

刪除節點很簡單,以單鏈表為例,牢記三點

  1. 避免斷鏈,刪除掉節點後,前一個節點的p->next一定要指向後一個節點(如果是頭節點,記得要將新表頭P指向到原來的第二個節點。如果是尾節點,記得要將新的尾節點p->next置為NULL,)。

  2. 避免野指針,刪除掉節點後,p->next=NULL;

  3. 避免內存泄漏,刪除的節點,要用free釋放堆內存。

如果是雙向鏈表,不過是多了一個對prev操作,道理是一樣的。

4. 如何用C語言創建一個鏈表,實現增、刪、改、查

#includex0dx0a#includex0dx0a#include x0dx0a//先定義一種student類型,表示一個學生的信息,如下:x0dx0atypedef struct studentx0dx0a{x0dx0aint num; //表示學號x0dx0achar name[30]; //表示姓名x0dx0afloat score; //表示分數x0dx0a}student;x0dx0a//定義一種NODE類型,表示一個結點信息,如下:x0dx0atypedef struct nodex0dx0a{x0dx0astudent st; //表示一個學生的信息x0dx0astruct node *next; //表示一個NODE類型的指針x0dx0a}NODE;x0dx0a//1、寫出建立一個帶頭結點的線性鏈表的函數,其中每個結點包括學號、姓名、分數三個數據域。函數形式如下:x0dx0aNODE *creat_link(int direction)x0dx0a{x0dx0aNODE *head,*p,*tail;x0dx0aint xh,i=1;x0dx0aif(direction==1) //當direction的值為1時,新建立的結點連到尾部x0dx0a{x0dx0atail=head=(NODE *)malloc(sizeof(NODE));x0dx0ahead->next=NULL;x0dx0aprintf("請輸入第%d個學生的學號:",i);x0dx0ascanf("%d",&xh);x0dx0awhile(xh>0) //從鍵盤臨時輸入學生情況,當輸入的學號非正,則鏈表建立完畢x0dx0a{x0dx0ap=(NODE *)malloc(sizeof(NODE));x0dx0ap->st.num=xh;x0dx0aprintf("請輸入第%d個學生的姓名:",i);x0dx0ascanf("%s",p->st.name);x0dx0aprintf("請輸入第%d個學生的成績:",i);x0dx0ascanf("%f",&p->st.score);x0dx0ap->next=NULL;x0dx0atail->next=p;x0dx0atail=p;x0dx0ai=i+1;x0dx0aprintf("請輸入第%d個學生的學號:",i);x0dx0ascanf("%d",&xh);x0dx0a}x0dx0a}x0dx0aelse if(direction==0) //當direction為0時,新建立的結點成為第一個結點x0dx0a{x0dx0ahead=(NODE *)malloc(sizeof(NODE));x0dx0ahead->next=NULL;x0dx0aprintf("請輸入第%d個學生的學號:",i);x0dx0ascanf("%d",&xh);x0dx0awhile(xh>0) //從鍵盤臨時輸入學生情況,當輸入的學號非正,則鏈表建立完畢x0dx0a{x0dx0ap=(NODE *)malloc(sizeof(NODE));x0dx0ap->st.num=xh;x0dx0aprintf("請輸入第%d個學生的姓名:",i);x0dx0ascanf("%s",p->st.name);x0dx0aprintf("請輸入第%d個學生的成績:",i);x0dx0ascanf("%f",&p->st.score);x0dx0ap->next=head->next;x0dx0ahead->next=p;x0dx0ai=i+1;x0dx0aprintf("請輸入第%d個學生的學號:",i);x0dx0ascanf("%d",&xh);x0dx0a}x0dx0a}x0dx0areturn head;x0dx0a}x0dx0a//2、寫出輸出上述鏈表各結點數據域值的函數。該函數對應的函數需要一個形參,表示鏈表的頭指針,形式如下:x0dx0avoid print_link(NODE *head)x0dx0a{x0dx0aNODE *p;x0dx0ap=head->next;x0dx0aprintf("%-10s%-20s%-10s\n","學號","姓名","分數");x0dx0awhile(p!=NULL)x0dx0a{x0dx0aprintf("%-10d%-20s%-10.1f\n",p->st.num,p->st.name,p->st.score);x0dx0ap=p->next;x0dx0a}x0dx0a//該函數能輸出head所指的鏈表的所有結點值,輸出形式如下:x0dx0a/*本函數輸出線性表sq中所有數據,形式如下:x0dx0a學號 姓名 分數x0dx0a12 張三 234.5x0dx0a18 李四 987.7x0dx0a??? ??? ??.*/x0dx0a}x0dx0a//3、寫出在鏈表中刪除結點的函數x0dx0aint del_link(NODE *head,char name[])x0dx0a{x0dx0aNODE *p,*p1;x0dx0ap=head->next;x0dx0ap1=head;x0dx0awhile(p!=NULL)x0dx0a{x0dx0aif(strcmp(p->st.name,name)!=0)x0dx0a{x0dx0ap1=p;x0dx0ap=p->next;x0dx0a}x0dx0aelsex0dx0a{x0dx0abreak;x0dx0a}x0dx0a}x0dx0aif(p!=NULL)x0dx0a{x0dx0ap1->next=p->next;x0dx0afree(p);x0dx0areturn 1;x0dx0a}x0dx0aelsex0dx0a{x0dx0areturn 0;x0dx0a}x0dx0a//刪除head所指的鏈表中,名字為name的結點,刪除成功返回1,不成功返回0x0dx0a}x0dx0a//4、寫出在鏈表中插入結點的演算法x0dx0aint insert(NODE *head,student x,int wz)x0dx0a{x0dx0aNODE *p=head;x0dx0aint i=0,jg;x0dx0aif(wz<=0)x0dx0a{x0dx0ajg=0;x0dx0a}x0dx0aelsex0dx0a{x0dx0awhile(inext;x0dx0a}x0dx0aif(p==NULL)x0dx0a{x0dx0ajg=0;x0dx0a}x0dx0aif(i=wz-1)x0dx0a{x0dx0a//找到wz前面的節點,p指向它x0dx0aNODE *q;x0dx0aq=(NODE *)malloc(sizeof(NODE));x0dx0aq->st.num=x.num;x0dx0astrcpy(q->st.name,x.name);x0dx0aq->st.score=x.score;x0dx0aq->next=p->next;x0dx0ap->next=q;x0dx0ajg=1;x0dx0a}x0dx0a}x0dx0areturn jg;x0dx0a//該函數能夠在wz這個結點之前,插入一個新結點,新結點的數據域為x。插入成功返回1,不成功返回0。x0dx0a}x0dx0a//5、寫出主函數,分別調用上面演算法所對應的程序,建立鏈表,並輸出鏈表的值。x0dx0avoid main()x0dx0a{x0dx0aNODE *head; //定義指針變數headx0dx0aint wz; //表示插入位置x0dx0achar xm[30];x0dx0astudent st; //定義一個變數st,用來表示一個學生的信息x0dx0ahead=creat_link(1);x0dx0aprint_link(head); //調用函數建立鏈表,並把返回值送給head;x0dx0a//調用函數,輸出鏈表中各個結點的值x0dx0a//輸入一個學生的有關信息,送給變數st的有關成員x0dx0aprintf("\n\n請輸入要插入的位置:");x0dx0ascanf("%d",&wz); //輸入wz的值x0dx0aprintf("請輸入要插入的學生的學號:");x0dx0ascanf("%d",&st.num);x0dx0aprintf("請輸入要插入的學生的姓名:");x0dx0ascanf("%s",st.name);x0dx0aprintf("請輸入要插入的學生的成績:");x0dx0ascanf("%f",&st.score); x0dx0a//調用函數,在鏈表中把學生st的值作為一個結點插入,如果插入成功,輸出新鏈表x0dx0aif(insert(head,st,wz)==1)x0dx0a{x0dx0aprintf("\n插入成功,新表為:\n");x0dx0aprint_link(head);x0dx0a}x0dx0aelsex0dx0a{x0dx0aprintf("插入不成功");x0dx0a}x0dx0a//調用函數,在鏈表中刪除一個指定結點的值,如果刪除成功,輸出新鏈表x0dx0aprintf("\n\n請輸入要刪除的學生的姓名:");x0dx0agetchar();x0dx0agets(xm);x0dx0aif(del_link(head,xm)==1)x0dx0a{x0dx0aprintf("\n刪除成功,新表為:\n");x0dx0aprint_link(head);x0dx0a}x0dx0aelsex0dx0a{x0dx0aprintf("刪除不成功");x0dx0a}x0dx0a}

5. 數據結構(C語言版)中的刪除鏈表中的一個節點

代碼如下:

#include <stdio.h>

#include <stdlib.h>

typedef struct List

{

int a;

List* next;

}list;

void newList(list* l)//創建結點

{

list* a[4];

for (int i = 0; i < 4; i++)

{

a[i] = (list*)malloc(sizeof(list));

a[i]->a = i+1 ;

}

l->next = a[0];

a[0]->next = a[1];

a[1]->next = a[2];

a[2]->next = a[3];

a[3]->next = NULL;

}

void printfList(list* l)//列印結點的數據內容

{

printf("該鏈表的內容是: ");

while (l->next)

{

printf("%d ", l->next->a);

l = l->next;

}

printf(" ");

}

void setList(list* l,int x,int y)

{

list* head = l;

l = l->next;

while (l)

{

if (l->a >=y || l->a <=x)//將結點的數據區與指定區域進行比較

{

head->next = l;//將滿足條件的結點連接在新表的最後一個結點

//指針後移

l = l->next;

head = head->next;

}

else

{

//不滿足的結點進行刪除

list* l1 = l;

l = l->next;

free(l1);

}

}

head->next = NULL;

}

int main()

{

list* l = (list*)malloc(sizeof(List));

newList(l);//初始化鏈表

printfList(l);//輸出舊表內容

setList(l,1,3);//進行修改

printfList(l);//輸出修改後的鏈表

//system("pause");

return 0;

}

(5)c語言單鏈表修改節點擴展閱讀

鏈表的特點

1、插入、刪除數據效率高,時間復雜度為O(1)級別(只需更改指針指向即可),隨機訪問效率低,時間復雜度O(n)級別(需要從鏈頭至鏈尾進行遍歷)。

2、和數組相比,內存空間消耗更大,因為每個存儲數據的節點都需要額外的空間存儲後繼指針。

常用的鏈表類型

1、單鏈表

1)每個節點只包含一個指針,即後繼指針。

2)單鏈表有兩個特殊的節點,即首節點和尾節點。用首節點地址表示整條鏈表,尾節點的後繼指針指向空地址null。

3)性能特點:插入和刪除節點的時間復雜度為O(1),查找的時間復雜度為O(n)。

2、循環鏈表

1)除了尾節點的後繼指針指向首節點的地址外均與單鏈表一致。

2)適用於存儲有循環特點的數據,比如約瑟夫問題。

3、雙向鏈表

1)節點除了存儲數據外,還有兩個指針分別指向前一個節點地址(前驅指針prev)和下一個節點地址(後繼指針next)。

2)首節點的前驅指針prev和尾節點的後繼指針均指向空地址。

6. C語言單鏈表節點

單鏈表的頭插入: L是頭結點, p是插入結點,

假設: 鏈表結構為 L->A->B...灶此拿

L->next=NULL;//這條語句有問題,頭結點插入是不需要這句的,否則.p->next=L->next就都等於null了;
p->next=L->next;//p的下個結點指向頭結點L的下個結點A,即:p的下個結點指向原第2個結點A
L->next=p;//頭結點L的下個結點指向p,即將p插入到L的後面
//最終結果為:L->P->A->B...

---------------------------------------
單鏈表的尾插入:L是尾結點,p是插入結點,r為標記末尾結點

假設: 鏈表結構為 ..A->B->L

L->next=NULL;隱搭//末尾結點沒有下個結點,即next指向null
r=L;//r標記末尾結點
p->next=NULL;//p待插入的末尾結點,同樣沒有下個結點,next指向null
r->next=p;//將末尾結點r的下個結點指向p,即:L下個扒旦結點指向p

r=p;//將r重新指向新的末尾結點p

//最終結果:A->B->L->P

7. 用C語言編寫的這個鏈表程序可以運行,但是在運行中查找不到給定值的節點, 求高手幫忙改一下,謝謝

源程序有語法錯誤也有邏輯錯誤,列舉蔽慶一二出來,其他的請自己對比修改好後的程序了。
【1】mian函數中引用的幾個函數,如insert();showall();函數中沒有放入參數,編譯器是不能編譯通過的。
【2】創建鏈表的函數沒有返回鏈神並老表頭指針,各種查找,刪除功能是無用武之地的。
【3】自己注意帶頭結點的鏈表與不帶頭結點的操作方式。
【4】代碼修改如下,可以正確運行。

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct linknode
{
char data;
struct linknode *next;
} Mynode;

void menu();
Mynode * Create();
void find(Mynode *head,char x);
Mynode * mydelete(Mynode *head,char x);
Mynode * insert(Mynode *head,char x);
void showall(Mynode *head);

void main()
{
char c;
int choice;
Mynode *head=NULL;
menu();
printf("本代碼實現鏈游升表的幾個基本功能,請選擇對應的功能選項進行相應操作:");
fflush(stdin);
scanf("%d",&choice);
while(1)
{
switch(choice)
{
case 1:
{
printf("請依次輸入鏈表的字元序列,結束請輸入'#'\n");
head = Create();
}
break;
case 2:
{
while(1)
{
printf("是否繼續? y/n?");
fflush(stdin);
scanf("%c",&c);
if(c=='y')
{
find(head,c);
}
else
break;
}
}
break;
case 3:
{
while(1)
{
printf("是否繼續? y/n?");
fflush(stdin);
scanf("%c",&c);
if(c=='y')
{
mydelete(head,c);
showall(head);
}
else
break;
}
}
break;
case 4:
{
while(1)
{
printf("是否繼續? y/n?");
fflush(stdin);
scanf("%c",&c);
if(c=='y')
{
insert(head,c);
showall(head);
}
else
break;
}
}
break;
case 5:
{
showall(head);
}
break;
case 0:
exit(0);
}
menu();
printf("本代碼實現鏈表的幾個基本功能,請選擇對應的功能選項進行相應操作:");
fflush(stdin);
scanf("%d",&choice);
}
}

void menu()
{
printf("本代碼實現鏈表的如下幾個基本功能,請選擇對應的功能選項進行相應操作:\n");
printf("1.創建鏈表\n");
printf("2.查找字元\n");
printf("3.刪除字元\n");
printf("4.插入字元\n");
printf("5.顯示所有字元\n");
printf("0.退出程序\n");
}
Mynode * Create()
{
Mynode *p,*head,*s;
char x;
head=(Mynode *)malloc(sizeof(Mynode));
head->next = NULL;
p=head;
fflush(stdin);
while(1)
{
// fflush(stdin);
scanf("%c",&x);
if(x!='#')
{
s=(Mynode *)malloc(sizeof(Mynode));
s->data=x;
p->next=s;
p=s;
}
else
break;
}

p->next=NULL;
return head;
}
void find(Mynode *head,char x)
{
Mynode *p;
int i=1;
p=head->next;
printf("輸入要查找的字元。");
fflush(stdin);
scanf("%c",&x);
while(p!=NULL&&p->data!=x)
{
p=p->next;
i++;
}
if(p!=NULL)
printf("結點位於第%d位\n",i);
else
printf("無此結點\n");
}
Mynode * mydelete(Mynode *head,char x)
{
Mynode *p,*q;
printf("輸入要刪除的字元。");
fflush(stdin);
scanf("%c",&x);
if(head==NULL)
printf("鏈表下溢");

q=head;
p=head->next;
while(p!=NULL&&p->data!=x)
{
if(p->data!=x)
{
q=p;
p=p->next;
}
}
if(p!=NULL)
{
q->next=p->next;
free(p);
}
else
{
printf("結點未找到.\n");
}
return head;
}
Mynode * insert(Mynode *head,char x)
{
Mynode *s,*p;
int j,i=0;
printf("輸入要插入的字元。");
fflush(stdin);
scanf("%c",&x);
printf("輸入插入位置。");
fflush(stdin);
scanf("%d",&i);
s=(Mynode *)malloc(sizeof(Mynode));
s->data=x;
s->next = NULL;
p=head;
j=1;
while(p->next!=NULL&&j<i)
{
j++;
p=p->next;
}
s->next = p->next;
p->next=s;
return head;
}
void showall(Mynode *head)
{
Mynode *p;

p=head->next;
while(p!=NULL)
{
printf("%c ",p->data);
p=p->next;
}
printf("\n");
}

8. C語言單鏈表 求大神教教怎麼修改

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

typedefstructnode
{
intdata;
structnode*next;
}node;

intmain(void){
intnum;
node*p,*head;
head=NULL;
do{
scanf("%d",&num);
if(num!=-1)
{
p=(node*)malloc(sizeof(node));
p->data=num;
p->next=NULL;
if(head==NULL)
head=p;
else
p->next=head;
head=p;
}
}while(num!=-1);
while(p!=NULL){
printf("%d",p->data);
p=p->next;
}
printf(" ");
return0;
}

已經修改好了,有問題如果問錯在哪可以追問

9. 數據結構c語言單鏈表的增刪改查程序:#include <stdio.h>

沒有main函數在你程序的最後加上

voidmain()
{
creates();
}

10. 急~~~功能是單鏈表的修改,C語言怎麼寫

你想怎麼修改?插入、刪除元素還是頌孫修改某個元素的值?
下面的程序我特意改的,實現了檢查某個元素的值和修改某個元素的值,兩個功能,已經調試過野察鏈,可以直接運行的了。如果你還想要添加其他功能,比如插入、刪除等等,你再給個回復,我給你寫。

#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
typedef struct LNode{
long data;
struct LNode *next;
}LNode;
LNode *Init_L(LNode *L)
{//建空鏈表L
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;
return L;
}
int len_L(LNode *L)
{//求L鏈表中節點的個數
int len=0;
LNode *p;
p=L->next;
while(p!=NULL)
{
++len;
p=p->next;
}
printf("該鏈表的長度:%d\n\n",len);
return len;
}
LNode *creat_L(LNode *L)
{//創建線性表L
int i,n;LNode *q;
do{
printf("創建表:\n");
printf("表的元素個數:");
scanf("%d",&n);
LNode *p;
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;
q=L;
for(i=1;i<=n;++i)
{
p=(LNode *)malloc(sizeof(LNode));
printf("請輸入第 %d 個數:",i);
scanf("%d",&p->data );
q->next =p;
q=q->next;q->next=NULL;
}
printf("\n創建成功!!!\n\n");
printf("想重新創建該表嗎?( 若選擇其它代表退出!!!)(Y:0/N:1) ");
scanf("%d",&i);
printf("\n");
}while(i==0);
return L;
}

void printf_L(LNode *L)
{//列印線性表L
LNode *p;
p=L;
printf("輸出該鏈表:\n");
if(p->next!=NULL)
do
{
printf("%d ",p->next->data);
p=p->next;
}while(p->next!=NULL);
printf("\n\n");
}

void check_L(LNode *L)
{//檢查L鏈表中第k個元素或這改變其內容
int i,j,k,len;
int c;
do
{
printf("請輸入檢沒拿查的節點位置:");
scanf("%d",&k);
len=len_L(L);
if(k>len) printf("錯誤!!!\n\n");
}while(k>len);
LNode *p;
p=L;
for(i=1;i<=k;i++)
{
p=p->next ;
}
do
{
printf("1.檢查第%d個節點的內容;\n",k);
printf("2.改變第%d個節點的內容:\n",k);
printf("( 若選擇其它代表退出!!!)\n\n");
printf("請選擇您要實現的功能: ");
scanf("%d",&j);
switch(j)
{
case 1: printf("其內容為: %d\n\n",p->data);break;
case 2: printf("請輸入改變後的內容:");
scanf("%d",&p->data);
printf("您想檢查結果嗎?(Y:0/N:1)");
scanf("%d",&i);
if(i==0) printf_L(L);
break;
}
printf("您想繼續檢查嗎(y:0/n:1)? ");
scanf("%d",&c);
}while(c==0);
return;
}
void main()
{
int t,n,k=2,i=2,v,j=7,len;
LNode *A,*B,*C,*D,*E,*F,*SUM,*SUB,*UNION;
A=creat_L(A);
check_L(A);

}