敢問樓主,為何要兩個鏈表?你的需求一個鏈表完全搞定了啊,第二個鏈表是用來做什么的?
成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計制作、做網(wǎng)站、韶山網(wǎng)絡(luò)推廣、小程序定制開發(fā)、韶山網(wǎng)絡(luò)營銷、韶山企業(yè)策劃、韶山品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)公司為所有大學生創(chuàng)業(yè)者提供韶山建站搭建服務(wù),24小時服務(wù)熱線:18982081108,官方網(wǎng)址:www.chinadenli.net
#includestdio.h???????????????????????????????????????????????????????????????
#includestdlib.h??????????????????????????????????????????????????????????????
struct?student{?????????????????????????????????????????????????????????????????
char?name[10];?????????????????????????????????????????????????????????????????
char?id[10];???????????????????????????????????????????????????????????????????
struct?student?*next;??????????????????????????????????????????????????????????
};??????????????????????????????????????????????????????????????????????????????
int?main(void)??????????????????????????????????????????????????????????????????
{???????????????????????????????????????????????????????????????????????????????
int?n;???????????????????????????????????????????????????????????????????????
printf("請輸入要學生個數(shù),以回車結(jié)束!\n");??????????????????????????????????
scanf("%d",n);??????????????????????????????????????????????????????????????
struct?student?*head=(struct?student?*)malloc(sizeof(struct?student));???????
head-next=NULL;?????????????????????????????????????????????????????????????
struct?student?*end=head;????????????????????????????????????????????????????
for(int?i=0;i!=n;i++)????????????????????????????????????????????????????????
{????????????????????????????????????????????????????????????????????????????
struct?student*p=(struct?student?*)malloc(sizeof(struct?student));?????????
p-next=NULL;??????????????????????????????????????????????????????????????
printf("第%d個學生信息:\n",i+1);??????????????????????????????????????????
printf("??姓名:");????????????????????????????????????????????????????????
scanf("%s",p-name);??????????????????????????????????????????????????????
printf("??學號:");????????????????????????????????????????????????????????
scanf("%s",p-id);????????????????????????????????????????????????????????
end-next=p;???????????????????????????????????????????????????????????????
end=p;?????????????????????????????????????????????????????????????????????
}????????????????????????????????????????????????????????????????????????????
for(struct?student?*p=head-next;p!=NULL;p=p-next)??????????????????????????
{????????????????????????????????????????????????????????????????????????????
printf("姓名:%s??學號:%s?\n",p-name,p-id);???????????????????????????????
}????????????????????????????????????????????????????????????????????????????
}
截圖如下:
如果已知一個節(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;
}
#includestdio.h
#includewindows.h
#include stdio.h
#include malloc.h
#include stdlib.h
//定義數(shù)據(jù)類型名稱
typedef int DataType;
#define flag -1?? ??? ?//定義數(shù)據(jù)輸入結(jié)束的標志數(shù)據(jù)
//單鏈表結(jié)點存儲結(jié)構(gòu)定義
typedef struct Node
{
DataType data;
struct Node *next;
}LNode ,*LinkList;
//建立單鏈表子函數(shù)
LNode *Create_LinkList()
{
LNode *s,*head,*L;int i=0,x;?? ??? ?//定義指向當前插入元素的指針
while(1)
{
scanf("%d",x);
if(-1==x)
{?? return head;
break;}
s= (LNode *)malloc(sizeof(LNode));?? ??? ?//為當前插入元素的指針分配地址空間
s-data =x;
s-next =NULL;
i++;
if(i==1)
head=s;
else
L-next =s;
L=s;
}
}
//查找子函數(shù)(按序號查找)
LNode *Get_LinkList(LinkList L,int i)
{
LNode *p;
int j;?? ??? ?//j是計數(shù)器,用來判斷當前的結(jié)點是否是第i個結(jié)點
p=L;
j=1;
while(p!=NULLji)
{
p=p-next ;?? ??? ?//當前結(jié)點p不是第i個且p非空,則p移向下一個結(jié)點
j++;
}
return p;
}
//插入運算子函數(shù)
void Insert_LinkList(LinkList L,int i,DataType x)?? ??? ?//在單鏈表L中第i個位置插入值為x的新結(jié)點
{
LNode *p,*s;
p =Get_LinkList(L,i);?? ??? ?//尋找鏈表的第i-1個位置結(jié)點
if(p==NULL)
{
printf("插入位置不合法!");
exit(-1);
}
else
{
s= (LinkList)malloc(sizeof(LNode));?? ??? ?//為當前插入元素的指針分配地址空間
s-data =x;
s-next =p-next ;
p-next =s;
}
}
//單鏈表的刪除運算子函數(shù)
void Delete_LinkList(LinkList L,int i)?? ??? ?//刪除單鏈表上的第i個結(jié)點
{
LNode *p,*q;
p=Get_LinkList(L,i-1);?? ??? ?//尋找鏈表的第i-1個位置結(jié)點
if(p==NULL)
{
printf("刪除的位置不合法!");?? ??? ?//第i個結(jié)點的前驅(qū)結(jié)點不存在,不能執(zhí)行刪除操作
exit(-1);
}
else
{
if(p-next ==NULL)
{
?printf("刪除的位置不合法!");?? ??? ?//第i個結(jié)點不存在,不能執(zhí)行刪除操作
?exit(-1);
}
else
{
?q=p-next ;
?p-next =p-next-next;
?free(q);
}
}
}
//求表長運算子函數(shù)
int Length_LinkList(LinkList L)
{
int l;?? ??? ?//l記錄L的表長
LNode *p;
p=L;
l=1;
while(p-next)
{
p=p-next;
l++;
}
return l;
}
int main ()
{
LNode *head,*p;
head=(LinkList)malloc(sizeof(LNode));
int x,y;
a:
printf("*******menu*******\n");
printf("**創(chuàng)建**********1*\n");
printf("**插入**********2*\n");
printf("**刪除**********3*\n");
printf("**表長**********4*\n");
printf("**清屏**********5*\n");
printf("**打印**********6*\n");
printf("**退出******other*\n");
printf("******************\n");
int i=1;
while(i)
{
printf("請輸入選項:");
scanf("%d",i);
switch(i)
{
case 1:head=Create_LinkList(); getchar();break;
case 2:printf("請輸入位置和數(shù)據(jù);");
scanf("%d%d",x,y);
Insert_LinkList(head,x,y);break;
case 3:printf("請輸入位置;");
scanf("%d",x);
Delete_LinkList(head,x);break;
case 4:printf("%d",Length_LinkList(head));break;
case 5:system("cls");goto a;
case 6:p=head;
while(p!=NULL)
{printf("%d\n",p-data);
p=p-next;}
break;
default :i=0;
}
}
}
我把創(chuàng)建給改了一下
#include stdio.h
#include stdlib.h
#define M 2
int n,i,j,x; //定義變量 ,M為行,n為列,i、j為循環(huán)變量,x為自變量
typedef struct Node //建立線性鏈表
{
int a[M][1];//定義一個列數(shù)組
struct Node*next;//指針成員
}LNode;
void create(LNode*head);//創(chuàng)建線性鏈表函數(shù)聲明
void display(LNode*head);//顯示線性鏈表函數(shù)聲明
void Deleteline(LNode*head);//刪除鏈表中的某幾列函數(shù)聲明
void Change(LNode*head);//改變鏈表中數(shù)據(jù)的函數(shù)的聲明
int main(int argc, char *argv[])
{
printf("列表目前行數(shù)等于2\n");
printf("目前列數(shù)等于0\n");//表示 m行0列
LNode*head;//定義鏈表頭指針
head=(LNode*)malloc(sizeof(LNode));//分配空間
head-next=NULL;//下一個為空
create(head);//建立線性鏈表
display(head);//顯示線性鏈表
Deleteline(head);//刪除某一列
display(head);//顯示
Change(head);//改變元素
system("PAUSE");
return 0;
}
void create(LNode*head)
{
LNode*p,*rear=head;//空的線性鏈表頭和尾
printf("輸入 '0'或'1'\n如果您輸入 '0',則結(jié)束輸入:");
scanf("%d",x);
n=0;//表示有0列
while(x)//輸入"0"則退出
{ if(!n)
printf("輸入第一列:\n");
else printf("輸入下一列:\n");
p=(LNode*)malloc(sizeof(LNode));//為指針分配空間
for(i=0;iM;i++)//循環(huán)輸入該列的每一行每一個元素
{ scanf("%d",x);
p-a[i][0]=x;
}
p-next=NULL;//新追加的結(jié)點為尾結(jié)點,后繼為空
rear-next=p;//新追加的結(jié)點在最后,也就是rear的后繼
rear=p;//新追加的結(jié)點為新的表尾,rear指向新的表尾
printf("輸入 '0'或'1'\n如果您輸入 '0',則結(jié)束輸入:");
scanf("%d",x);
n++;//列數(shù)自增一
}
}
void display(LNode*head)//列表顯示函數(shù)
{
LNode*p=head-next;//定義指針成員指向表頭
printf("列表\n");//顯示列表名稱并換行
for(j=0;jM;j++)
{
for(i=0;in;i++)//執(zhí)行 “行循環(huán) ”
{
printf("%d\t",p-a[j][0]); //
p=p-next;//p指向下一元素
}
p=head-next;//重新指到表頭
printf("\n");//換行
}
printf("n=%d\n",n);
}
void Deleteline(LNode*head)
{
LNode*p=head-next;//定義成員指針
int k;//定義所刪除的列序號
printf("輸入您要刪除的列序號:");//提示輸入列序號
scanf("%d",k);//接收列序號
if(k==1)
{
head-next=p-next;//將頭指針的后繼變?yōu)榈诙?/p>
free(p);//釋放空間
n--;//n自減
printf("n=%d\n",n);
}
else if(kn)
{
for(i=2;ik;i++)//循環(huán)找到節(jié)點的前驅(qū)
{
p=p-next;
}
LNode*q=p-next;//定義指向所刪除列的指針
p-next=q-next;//把所刪除的列節(jié)點的后繼賦給其前驅(qū)的后繼
free(q);//釋放空間
n--;
printf("n=%d\n",n);
}
else
{
for(i=1;ik;i++)//直接找到
{
p=p-next;
}
free(p);//釋放
n--;
printf("n=%d\n",n);
}
}
void Change(LNode*head)
{
int k;//定義所要改變的元素的列數(shù)
LNode*p=head-next;//定義指向第一個元素的結(jié)構(gòu)指針
printf("輸入您要改變的元素的行坐標:");//提示輸入要改變的元素的行坐標
scanf("%d",j);//接收
printf("輸入您要改變的元素的列坐標:");//提示輸入要改變的元素的列坐標
scanf("%d",k);//接收
for(i=1;ik;i++)//找到
{
p=p-next;
}
printf("請輸入改變后的值:");//提示輸入改變的值
scanf("%d",x);//接收
p-a[j-1][0]=x;//傳值
display(head);//再現(xiàn)
}
我這是一個鏈表構(gòu)造的列表,功能有:建立一個列表、刪除一列,顯示列表、改變具體位置的元素值四個大功能。不過行數(shù)初始化確定了的,是2,你也可以自己設(shè)計如何在dos窗口動態(tài)輸入。注釋都有,你自己還可以修改其中的函數(shù)和語句,使這個結(jié)構(gòu)功能變得更強大。
希望對你有所幫助!!!
struct
student
*creat(void)
{struct
student
*head;
struct
student
*p1,*p2;
n=0;
p1=p2=(struct
student*)malloc(len);
//這里格式化輸入二個數(shù)0,0
scanf("%ld,%f",p1-num,p1-score);
//head賦值為null
head=null;
//剛才輸入的是0因此不滿足條件一次循環(huán)都不走
while(p1-num!=0)
{
n=n+1;
if(n==1)head=p1;
else
p2-next=p1;
p2=p1;
p1=(struct
student*)malloc(len);
scanf("%ld,%f",p1-num,p1-score);
}
p2-next=null;
//所以這時候head還是最初賦的值null自然打不出信息
return(head);
}
分享標題:c語言函數(shù)輸入鏈表 c++輸入鏈表
文章起源:http://www.chinadenli.net/article24/hpjdje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、網(wǎng)頁設(shè)計公司、網(wǎng)站設(shè)計、企業(yè)網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)、做網(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)