在給定的單鏈表的第i位上插入值為n的節(jié)點。
創(chuàng)新互聯(lián)是由多位在大型網(wǎng)絡公司、廣告設計公司的優(yōu)秀設計人員和策劃人員組成的一個具有豐富經(jīng)驗的團隊,其中包括網(wǎng)站策劃、網(wǎng)頁美工、網(wǎng)站程序員、網(wǎng)頁設計師、平面廣告設計師、網(wǎng)絡營銷人員及形象策劃。承接:成都網(wǎng)站建設、做網(wǎng)站、網(wǎng)站改版、網(wǎng)頁設計制作、網(wǎng)站建設與維護、網(wǎng)絡推廣、數(shù)據(jù)庫開發(fā),以高性價比制作企業(yè)網(wǎng)站、行業(yè)門戶平臺等全方位的服務。
#include stdio.h
#includemalloc.h
#define N 5
typedef int elemtype;
typedef struct node
{
elemtype data;
struct node *next;
}linklist;
linklist *Creatlist(linklist*L){
L=(linklist*)malloc(sizeof(linklist));
L-next=NULL;
return L;
}
int Judge(linklist *L){
if(L-next==NULL)
{
printf("建表成功...\n");
}
else
printf("建表失敗.\n");
return 0;
}
int Input(linklist *L,int x,linklist *r){
int i;
linklist *p;
p=(linklist*)malloc(sizeof(linklist));
p-data=x;
p-next=NULL;
r-next=p;
printf("%d ",p-data);
return 0;
}
int Insert1(linklist *L,int i){
linklist *p,*q,*r,*t;
int j=1,item;
p=L-next;
q=L;
r=L;
if(L-next==NULL)
{
printf("表空.\n");
return 0;
}
else
{
while(p!=NULLji)
{
q=p;
p=p-next;
j++;
}
if(p==NULL)
{
printf("%d不在表的范圍內(nèi).\n");
return 0;
}
else
{
t=(linklist*)malloc(sizeof(linklist));
t-next=NULL;
printf("請輸入item:");
scanf("%d",item);
t-data=item;
t-next=p;
q-next=t;
}
printf("在第%d位上插入值為%d的節(jié)點后的所有數(shù)據(jù)為\n",i,item);
for(j=0;jN+1;j++)
{
r=r-next;
printf("%d ",r-data);
}
printf("\n");
return 1;
}
}
int main()
{
int i,item,k;
linklist *L,*r;
printf("單向鏈表的創(chuàng)建(包括初始化)與輸出\n");
L=Creatlist(L);
Judge(L);
printf("表中的數(shù)據(jù)為:");
r=L;
Input(L,11,r);
r=r-next;
Input(L,32,r);
r=r-next;
Input(L,17,r);
r=r-next;
Input(L,46,r);
r=r-next;
Input(L,9,r);
r=r-next;
printf("\n");
printf("在給定的單鏈表的第i位上插入值為item的節(jié)點\n");
printf("請輸入i:");
scanf("%d",i);
Insert1(L,i);
return 0;
}
在給定單鏈表的值為m的節(jié)點的前面插入一個值為n的節(jié)點
#include stdio.h
#includemalloc.h
#define N 5
typedef int elemtype;
typedef struct node
{
elemtype data;
struct node *next;
}linklist;
linklist *Creatlist(linklist*L){
L=(linklist*)malloc(sizeof(linklist));
L-next=NULL;
return L;
}
int Judge(linklist *L){
if(L-next==NULL)
{
printf("建表成功...\n");
}
else
printf("建表失敗.\n");
return 0;
}
int Input(linklist *L,int x,linklist *r){
int i;
linklist *p;
p=(linklist*)malloc(sizeof(linklist));
p-data=x;
p-next=NULL;
r-next=p;
printf("%d ",p-data);
return 0;
}
int Insert2(linklist *L,int item){
linklist *p,*q,*r,*t;
int j=1,m;
p=L-next;
r=L;
q=L;
if(L-next==NULL)
{
printf("表空.\n");
return 0;
}
else
{
while(p!=NULL)
{
if(p-data!=item)
{
q=p;
p=p-next;
}
else
break;
}
if(p==NULL)
{
printf("%d不在表的范圍內(nèi).\n");
return 0;
}
else
{
t=(linklist *)malloc(sizeof(linklist));
t-next=NULL;
printf("請輸入m:");
scanf("%d",m);
t-data=m;
q-next=t;
t-next=p;
}
}
printf("在值為%d的節(jié)點的前面插入一個值為%d的節(jié)點后的所有數(shù)據(jù)為\n",item,m);
for(j=0;jN+1;j++)
{
r=r-next;
printf("%d ",r-data);
}
printf("\n");
return 1;
}
int main()
{
int i,item,k;
linklist *L,*r;
printf("單向鏈表的創(chuàng)建(包括初始化)與輸出\n");
L=Creatlist(L);
Judge(L);
printf("表中的數(shù)據(jù)為:");
r=L;
Input(L,11,r);
r=r-next;
Input(L,32,r);
r=r-next;
Input(L,17,r);
r=r-next;
Input(L,46,r);
r=r-next;
Input(L,9,r);
r=r-next;
printf("\n");
printf("在給定單鏈表的值為item的節(jié)點的前面插入一個值為m的節(jié)點\n");
printf("請輸入item:");
scanf("%d",item);
Insert2(L,item);
return 0;
}
學到指針,也要開始學習C語言的調(diào)試技能了,發(fā)現(xiàn)問題,最好自己調(diào)試解決。
如果編程軟件支持斷點,單步調(diào)試等功能那就最好了,如果不支持,也可以使用printf()語句打印相關(guān)的變量值來進行調(diào)試。
主要問題出在scan()函數(shù)
scan(struct linklist1 *a,struct linklist2 *b,struct linklist1 **p,struct linklist2 **q)
{
struct linklist1 *m;
int i=0,u=0;
m=a-next;
while(a-next!=0)
{a=a-next;
i++;
if(a-xhm-xh)/*當只剩下一個記錄時,u=0*/
{m=a;
u=i;
}
}
*p=m;
for(i=0;iu;i++) /* u=0時,這個循環(huán)不會執(zhí)行 */
b=b-next;
*q=b; /* u=0時,這里就出錯了 */
}
修改后的代碼,有簡單的調(diào)試信息輸出
#include "stdio.h"
struct linklist1
{
int xh;
struct linklist1 *next;
};
struct linklist2
{
int grade;
struct linklist2 *next;
};
struct conlink
{
int xh;
int grade;
struct conlink *next;
};
struct linklist1 *creat1()
/**創(chuàng)建單鏈表a**/
{
int i;
struct linklist1 *head,*p,*q;
head=(struct linklist1 *)malloc(sizeof(struct linklist1));
p=q=head;
printf("please input 5 xh:\n");
for(i=0;i5;i++)
{p=(struct linklist1 *)malloc(sizeof(struct linklist1));
scanf("%d",(p-xh));
p-next=0;
q-next=p;
q=p;
}
return head;
}
struct linklist2 *creat2()
/**創(chuàng)建單鏈表b**/
{int i;
struct linklist2 *head,*p,*q;
head=(struct linklist2 *)malloc(sizeof(struct linklist2));
p=q=head;
printf("please input 5 grade:\n");
for(i=0;i5;i++)
{p=(struct linklist2 *)malloc(sizeof(struct linklist2));
scanf("%d",(p-grade));
p-next=0;
q-next=p;
q=p;
}
return head;
}
scann(struct linklist1 *a,struct linklist2 *b,struct linklist1 **p,struct linklist2
**q)
/**查找單鏈表中學號最大的結(jié)點,存入*p,對應的成績存入*q**/
{
struct linklist1 *m = a-next;
printf("scan()...\n");
while(a-next b-next)
{
a=a-next;
b=b-next;
if(a-xh = m-xh)
{
*p=a;
*q=b;
printf("xh=%d grade = %d\n", (*p)-xh, (*q)-grade);
getch();
}
}
}
conlink(struct conlink *head,struct linklist1 *p,struct linklist2 *q)
/**用頭插法建立單鏈表c**/
{
struct conlink *a;
printf("conlink()...\n");
a=(struct conlink *)malloc(sizeof(struct conlink));
a-xh=p-xh;
a-grade=q-grade;
a-next=head-next;
head-next=a;
}
outlist1(struct linklist1 *head,struct linklist1 *p)
/**刪除a單鏈表中學號最大的結(jié)點(最大的結(jié)點用scan函數(shù)已經(jīng)找出)**/
{
while(head-next head-next!=p)
head=head-next;
head-next=p-next;
free(p);
}
outlist2(struct linklist2 *head,struct linklist2 *q)
/**刪除b單鏈表中對應的結(jié)點**/
{
while(head-next head-next!=q)
head=head-next;
head-next=q-next;
free(q);
}
output(struct conlink *head)
/**輸出c鏈表**/
{
while(head-next!=0)
{
printf("%d %d\n",head-next-xh,head-next-grade);
head=head-next;
}
}
main()
{
struct linklist1 *a;
struct linklist2 *b;
struct linklist1 *p;
struct linklist2 *q;
struct conlink *head;
a=creat1();
b=creat2();
head=(struct conlink *)malloc(sizeof(struct conlink));
head-next=0;
while(a-next!=0)
{
scan(a,b,p,q);
conlink(head,p,q);
outlist1(a,p);
outlist2(b,q);
}
output(head);
getch();
}
首先,主函數(shù)中,“請輸入插入的數(shù)據(jù)”那里scanf應該是b,這是引發(fā)崩潰的原因。
其次,insert函數(shù)的目的應該是想插入數(shù)據(jù)后仍是有序鏈表。但你的insert函數(shù)邏輯太亂,有些不必要的判斷,我修正了你的代碼,貼給你看看。(雖然你insert是想保證有序,但你在創(chuàng)建的時候沒有保證有序,所以最終結(jié)果不一定是有序。例如,創(chuàng)建 1,5,2,插入3,最后輸出的是 1,3,5,2)
代碼修改:
scanf("%d", b);
重寫了insert函數(shù),簡化邏輯;
動態(tài)分配的內(nèi)存記得釋放,增加freeNode釋放空間
#include?stdio.h
#include?stdlib.h
struct?link
{
int?data;
struct?link?*next;
};
struct?link?*add(struct?link?*head);//創(chuàng)建鏈表?
void?display(struct?link?*head);//輸出數(shù)據(jù)?
struct?link?*insert(struct?link?*head,?int?b);?//插入新節(jié)點?
void?freeNode(struct?link?*); //釋放空間
int?main()
{
char?c;
struct?link?*head?=?NULL;
printf("要創(chuàng)建一個鏈表嗎?");
scanf("?%c",?c);
while?(c?==?'y'?||?c?==?'Y')
{
head?=?add(head);
printf("要繼續(xù)創(chuàng)建節(jié)點嗎?");
scanf("?%c",?c);
}
display(head);
int?b;
printf("輸入插入的數(shù)據(jù)");
scanf("%d",?b);
head?=?insert(head,?b);
display(head);
freeNode(head);
}
struct?link?*add(struct?link?*head)
{
int?data;
struct?link?*p?=?(struct?link*)malloc(sizeof(struct?link));
if?(head?==?NULL)
{
head?=?p;
}
else
{
struct?link?*pr?=?head;//一個臨時指針pr先保存下head的地址?
while?(pr-next?!=?NULL)
{
pr?=?pr-next;
}
pr-next?=?p;
}
printf("輸入數(shù)據(jù)");
scanf("%d",?p-data);
p-next?=?NULL;
return?head;
}
void?display(struct?link?*head)
{
struct?link?*pr?=?head;
while?(pr?!=?NULL)
{
printf("%d\n",?pr-data);
pr?=?pr-next;
}
}
struct?link?*insert(struct?link?*head,?int?b)
{
struct?link?*ptr?=?head,?*prev?=?head;
struct?link?*newNode?=?(struct?link?*)malloc(sizeof(struct?link));
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;
return?head;
}
void?freeNode(struct?link?*node)?{
if?(!node) return;
freeNode(node-next);
free(node);
}
如果已知一個節(jié)點指針pre和一個節(jié)點指針cur,要把cur插入到pre節(jié)點之后,很顯然要保證鏈表不會斷開而丟失后面的節(jié)點,要先把后面的節(jié)點指針(指向lat的指針)保存下來,即有cur-next
=
pre-next,然后把cur連接的一串鏈表連接到pre后面,即pre-next
=
cur;
上面介紹了,在一個節(jié)點之后插入節(jié)點的情況。這是通常的情況。如果要向一個鏈表的頭部插入節(jié)點,就只需要將新節(jié)點的下一個指針指向鏈表的頭指針即可。
在這種情況下,有兩點要注意:
1,鏈表是否為空鏈表
2,要插入的節(jié)點是不是空指針。
代碼實現(xiàn):
//向單鏈表中插入一個節(jié)點(插入在鏈開始處)
//輸入?yún)?shù):單鏈表的頭指針和要插入的節(jié)點指針
//輸出參數(shù):無
//返回值:指向單鏈表的頭指針
singlelist*
insert(singlelist
*head,singlelist
*node)
{
if(node
==
null)
{
return
head;
}
else
if(head
==
null)
{
return
node;
}
node-next
=
head;
head
=
node;
return
head;
}
s-data=y;
寫反了。
void insert_list(list *head,int i,int y)
{
list *p,*s;int j=0;
p=head;
do
{
p=p-next;
j++;
}while(ji-1);
if(j==i-1)
{
s=(list *)malloc(sizeof(list));
/* 這里寫反了 y=s-data; */
s-data=y;
s-next=p-next;
p-next=s;
}
}
1.main函數(shù)中的LinkList L;
改成
LinkList L = (LinkList)malloc(sizeof(LNode));
2.PrintfList函數(shù)中把L = (LinkList)malloc(sizeof(LNode));這一句去掉
原因是main函數(shù)中的L變量是個沒初始化的野指針,L作為參數(shù)傳入TailCreateList函數(shù)并不會改變L的值,這點你可以調(diào)試的時候跟蹤L的值
本文名稱:c語言單鏈表插入函數(shù) C語言建立單鏈表
本文鏈接:http://www.rwnh.cn/article16/doohgdg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供Google、網(wǎng)站設計、ChatGPT、、網(wǎng)站內(nèi)鏈、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)