敢問樓主,為何要兩個鏈表?你的需求一個鏈表完全搞定了啊,第二個鏈表是用來做什么的?
成都創新互聯公司專注為客戶提供全方位的互聯網綜合服務,包含不限于網站設計制作、做網站、韶山網絡推廣、小程序定制開發、韶山網絡營銷、韶山企業策劃、韶山品牌公關、搜索引擎seo、人物專訪、企業宣傳片、企業代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;成都創新互聯公司為所有大學生創業者提供韶山建站搭建服務,24小時服務熱線:18982081108,官方網址:vcdvsql.cn
#includestdio.h???????????????????????????????????????????????????????????????
#includestdlib.h??????????????????????????????????????????????????????????????
struct?student{?????????????????????????????????????????????????????????????????
char?name[10];?????????????????????????????????????????????????????????????????
char?id[10];???????????????????????????????????????????????????????????????????
struct?student?*next;??????????????????????????????????????????????????????????
};??????????????????????????????????????????????????????????????????????????????
int?main(void)??????????????????????????????????????????????????????????????????
{???????????????????????????????????????????????????????????????????????????????
int?n;???????????????????????????????????????????????????????????????????????
printf("請輸入要學生個數,以回車結束!\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);???????????????????????????????
}????????????????????????????????????????????????????????????????????????????
}
截圖如下:
如果已知一個節點指針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;
}
#includestdio.h
#includewindows.h
#include stdio.h
#include malloc.h
#include stdlib.h
//定義數據類型名稱
typedef int DataType;
#define flag -1?? ??? ?//定義數據輸入結束的標志數據
//單鏈表結點存儲結構定義
typedef struct Node
{
DataType data;
struct Node *next;
}LNode ,*LinkList;
//建立單鏈表子函數
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;
}
}
//查找子函數(按序號查找)
LNode *Get_LinkList(LinkList L,int i)
{
LNode *p;
int j;?? ??? ?//j是計數器,用來判斷當前的結點是否是第i個結點
p=L;
j=1;
while(p!=NULLji)
{
p=p-next ;?? ??? ?//當前結點p不是第i個且p非空,則p移向下一個結點
j++;
}
return p;
}
//插入運算子函數
void Insert_LinkList(LinkList L,int i,DataType x)?? ??? ?//在單鏈表L中第i個位置插入值為x的新結點
{
LNode *p,*s;
p =Get_LinkList(L,i);?? ??? ?//尋找鏈表的第i-1個位置結點
if(p==NULL)
{
printf("插入位置不合法!");
exit(-1);
}
else
{
s= (LinkList)malloc(sizeof(LNode));?? ??? ?//為當前插入元素的指針分配地址空間
s-data =x;
s-next =p-next ;
p-next =s;
}
}
//單鏈表的刪除運算子函數
void Delete_LinkList(LinkList L,int i)?? ??? ?//刪除單鏈表上的第i個結點
{
LNode *p,*q;
p=Get_LinkList(L,i-1);?? ??? ?//尋找鏈表的第i-1個位置結點
if(p==NULL)
{
printf("刪除的位置不合法!");?? ??? ?//第i個結點的前驅結點不存在,不能執行刪除操作
exit(-1);
}
else
{
if(p-next ==NULL)
{
?printf("刪除的位置不合法!");?? ??? ?//第i個結點不存在,不能執行刪除操作
?exit(-1);
}
else
{
?q=p-next ;
?p-next =p-next-next;
?free(q);
}
}
}
//求表長運算子函數
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("**創建**********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("請輸入位置和數據;");
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;
}
}
}
我把創建給改了一下
#include stdio.h
#include stdlib.h
#define M 2
int n,i,j,x; //定義變量 ,M為行,n為列,i、j為循環變量,x為自變量
typedef struct Node //建立線性鏈表
{
int a[M][1];//定義一個列數組
struct Node*next;//指針成員
}LNode;
void create(LNode*head);//創建線性鏈表函數聲明
void display(LNode*head);//顯示線性鏈表函數聲明
void Deleteline(LNode*head);//刪除鏈表中的某幾列函數聲明
void Change(LNode*head);//改變鏈表中數據的函數的聲明
int main(int argc, char *argv[])
{
printf("列表目前行數等于2\n");
printf("目前列數等于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',則結束輸入:");
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++)//循環輸入該列的每一行每一個元素
{ scanf("%d",x);
p-a[i][0]=x;
}
p-next=NULL;//新追加的結點為尾結點,后繼為空
rear-next=p;//新追加的結點在最后,也就是rear的后繼
rear=p;//新追加的結點為新的表尾,rear指向新的表尾
printf("輸入 '0'或'1'\n如果您輸入 '0',則結束輸入:");
scanf("%d",x);
n++;//列數自增一
}
}
void display(LNode*head)//列表顯示函數
{
LNode*p=head-next;//定義指針成員指向表頭
printf("列表\n");//顯示列表名稱并換行
for(j=0;jM;j++)
{
for(i=0;in;i++)//執行 “行循環 ”
{
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;//將頭指針的后繼變為第二列
free(p);//釋放空間
n--;//n自減
printf("n=%d\n",n);
}
else if(kn)
{
for(i=2;ik;i++)//循環找到節點的前驅
{
p=p-next;
}
LNode*q=p-next;//定義指向所刪除列的指針
p-next=q-next;//把所刪除的列節點的后繼賦給其前驅的后繼
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;//定義所要改變的元素的列數
LNode*p=head-next;//定義指向第一個元素的結構指針
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);//再現
}
我這是一個鏈表構造的列表,功能有:建立一個列表、刪除一列,顯示列表、改變具體位置的元素值四個大功能。不過行數初始化確定了的,是2,你也可以自己設計如何在dos窗口動態輸入。注釋都有,你自己還可以修改其中的函數和語句,使這個結構功能變得更強大。
希望對你有所幫助!!!
struct
student
*creat(void)
{struct
student
*head;
struct
student
*p1,*p2;
n=0;
p1=p2=(struct
student*)malloc(len);
//這里格式化輸入二個數0,0
scanf("%ld,%f",p1-num,p1-score);
//head賦值為null
head=null;
//剛才輸入的是0因此不滿足條件一次循環都不走
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語言函數輸入鏈表 c++輸入鏈表
文章起源:http://vcdvsql.cn/article24/hpjdje.html
成都網站建設公司_創新互聯,為您提供、網頁設計公司、網站設計、企業網站制作、外貿網站建設、做網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯