LinkList
萬源網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應式網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運營維護。成都創(chuàng)新互聯(lián)公司從2013年開始到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司。
*q=L,*p;
//這里,你的p沒有賦值,當然p=p-next會出錯了??!
程序?qū)憣α说脑?,按你的情況是可以去掉那個的
修改:
LinkList
*q,*p=L;
#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)建給改了一下
printf("是否需要重新統(tǒng)計班級男女生比例:yes--1,no--0:");
scanf("%d\n",flag);//這里多個\n去掉,會影響你正常輸入
變成scanf("%d",flag);
下面的程序是單鏈表的建立與輸出,都有詳細的注釋,相信你能看的懂
但要想學習鏈表必須得掌握了一定的C語言基礎(chǔ)
下面這個鏈表的作用是建立5個結(jié)點的單鏈表,5個結(jié)點的值輸入以后,依次輸出各個結(jié)點的值
#includestdio.h
#includestdlib.h
//鏈表的建立與輸出
struct node//定義結(jié)點的類型
{
int num,score;
node*link;
};
void main()
{
node*creat(int n);//函數(shù)原型聲明
void print(node*h);//函數(shù)原型聲明
node*head=0;//定義鏈頭指針并初始化
head=creat(5);//調(diào)用creat函數(shù)創(chuàng)建鏈表
print(head);//調(diào)用print函數(shù)輸出鏈表
}
node*creat(int n)
{
node*h=0,*p,*q;
int i;
for(i=1;i=n;i++)
{
q=(node*)malloc(sizeof(node));//分配一個結(jié)點空間
scanf("%d%d",q-num,q-score);//輸入新結(jié)點的值
q-link=0;//新結(jié)點的指針域置0
if(h==0)
h=q;//第一個結(jié)點作為鏈頭結(jié)點
else
p-link=q;//新結(jié)點添加到鏈表的末尾
p=q;
}
return h;//返回鏈頭指針
}
void print(node*h)//鏈表輸出函數(shù)的定義
{
while(h)//當指針h非空時輸出h所指結(jié)點的值
{
printf("num=%d\tscore=%d\n",h-num,h-score);
h=h-link;//使h指向下一個結(jié)點
}
}