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語言中鏈表怎麼刪除結點
有分才有動力啊哥們。
刪除節點很簡單,以單鏈表為例,牢記三點
避免斷鏈,刪除掉節點後,前一個節點的p->next一定要指向後一個節點(如果是頭節點,記得要將新表頭P指向到原來的第二個節點。如果是尾節點,記得要將新的尾節點p->next置為NULL,)。
避免野指針,刪除掉節點後,p->next=NULL;
避免內存泄漏,刪除的節點,要用free釋放堆內存。
如果是雙向鏈表,不過是多了一個對prev操作,道理是一樣的。
4. 如何用C語言創建一個鏈表,實現增、刪、改、查
#include
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);
}