重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
#includestdio.h
成都創(chuàng)新互聯(lián)是一家專業(yè)提供陽信企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站制作、成都網(wǎng)站制作、H5建站、小程序制作等業(yè)務(wù)。10年已為陽信眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。
#includestdlib.h
typedef struct data?{?int number;?struct data *next;?} DATA;
int main()?{?int n;?DATA *head,*p;
printf("how many?\n"); scanf("%d",n); head=create(n); printf("there is all\n");
while ( head!=NULL ) { printf("%d ",head-number); head=head-next; } printf("\n");
while ( head!=NULL ) {?p=head; head=head-next; free(p); }
return 0;
}
DATA *create(int n)?{?DATA *head=NULL,*t=NULL,*tial=NULL;?int i;
printf("let's create it\n");?head=(DATA*)malloc(sizeof(DATA));
if ( !head )?{?printf("error"); return NULL;?}
head-next=NULL;?printf("enter your data\n");? scanf("%d",head-number);
for ( i=1,tial=head;in;i++ )?{
t=(DATA*)malloc(sizeof(DATA));?if ( !t )?{?printf("error"); return head; }
scanf("%d",t-number);?t-next=NULL; tial-next=t;?tial=t;
}
return head;
}
主函數(shù)這里
Linklist?List;
printf("輸入創(chuàng)建鏈表的長度:");
scanf("%d",num);
CreateList_H(List,num); //創(chuàng)建鏈表
改為?
LNode?List;
printf("輸入創(chuàng)建鏈表的長度:");
scanf("%d",num);
CreateList_H(List,num); //創(chuàng)建鏈表
函數(shù)內(nèi)在堆上分配好內(nèi)存,但是 沒有傳遞到棧上
另外?你的變量名很迷人
#includestdio.h
#includestdlib.h
//鏈表定義
typedef int ElemType;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
/*************************************
* 鏈表函數(shù) *
*************************************/
//鏈表初始化
void InitLink(LinkList L);
//創(chuàng)建函數(shù),尾插法
void CreateLink_T(LinkList L,int n);
//創(chuàng)建函數(shù),頭插法
void CreateLink_H(LinkList L,int n);
//銷毀函數(shù)
void DestroyLink(LinkList L);
//判斷是否為空函數(shù)
bool EmptyLink(LinkList L);
//獲取函數(shù)
bool GetLink(LinkList L,int i,int e);
//插入函數(shù)
void InsertLink(LinkList L,int i,int e);
//刪除函數(shù)
void DeleteLink(LinkList L,int i,int e);
//遍歷函數(shù)
void TraverseLink(LinkList L);
//鏈表長度函數(shù)
int LengthLink(LinkList L);
//合并函數(shù)
void MergeLink(LinkList L1,LinkList L2);
void main()
{
LinkList L1,L2;
InitLink(L1);
InitLink(L2);
CreateLink_H(L1,2);
CreateLink_T(L2,2);
TraverseLink(L1);
printf("\n");
TraverseLink(L2);
printf("\n");
MergeLink(L1,L2);
TraverseLink(L1);
TraverseLink(L2);
}
//創(chuàng)建函數(shù),尾插法
void InitLink(LinkList L)
{
L=(LinkList)malloc(sizeof(LNode));
if (!L)
{
printf("Init error\n");
return;
}
L-next=NULL;
}
void CreateLink_T(LinkList L,int n)
{
if(n1)
{
printf("n must =1\n");
return ;
}
else
{
// L=(LinkList)malloc(sizeof(LNode));
L-next=NULL;
for(int i=0;in;i++)
{
LinkList p=(LinkList)malloc(sizeof(LNode));// the lower letter p
printf("enter the data :\t");
scanf("%d",(p-data));
p-next=L-next;
L-next=p;
}
}
}
//創(chuàng)建函數(shù),頭插法
void CreateLink_H(LinkList L,int n)
{
if (n1)
{
printf("n must =1\n ");
return;
}
else
{
//L=(LinkList)malloc(sizeof(LNode));
LinkList pre=(LinkList)malloc(sizeof(LNode));
L-next=NULL;
pre=L;
for(int i=0;in;i++)
{
LinkList p=(LinkList)malloc(sizeof(LNode));
printf("enter the data:\t");
scanf("%d",(p-data));
pre-next=p;
pre=p;
}
pre-next=NULL;
}
}
//銷毀函數(shù)
void DestroyLink(LinkList L)
{
LinkList q=L,p=L;
while (p)
{
q=p;
p=p-next;
free(q);
}
L-next=NULL;
}
//判斷是否為空函數(shù)
bool EmptyLink(LinkList L)
{
if (NULL==L-next)
{
return true;
}
else
{
return false;
}
}
//獲取函數(shù)
bool GetLink(LinkList L,int i,int e)
{
if (i1)
{
return false;
}
else
{
if (EmptyLink(L))
{
return false;
}
LinkList p=L-next;
int j=1;
while(pji)
{
p=p-next;
j++;
}
if (!p||ji)
{
return false;
}
else
{
e=p-data;
return true;
}
}
}
//插入函數(shù)
void InsertLink(LinkList L,int i,int e)
{
if (i0||iLengthLink(L))
{
printf("Insert error\n");
return;
}
else
{
LinkList p=L;
int j=0;
while(p(ji))
{
p=p-next;
j++;
}
if (!p||ji)
{
printf("Insert error\n");
return;
}
else
{
LinkList q=(LinkList)malloc(sizeof(LNode));
q-data=e;
q-next=p-next;
p-next=q;
}
}
}
//刪除函數(shù)
void DeleteLink(LinkList L,int i,int e)
{
if(i=0||iLengthLink(L))
{
printf("delete error\n");
return;
}
else
{
LinkList p=L;
int j=0;
while(pji-1)
{
p=p-next;
j++;
}
if(!p||ji)
{
printf("please enter i again\n");
return;
}
else
{
LinkList q=p-next;
e=p-next-data;
p-next=p-next-next;
free(q);
}
}
}
//遍歷函數(shù)
void TraverseLink(LinkList L)
{
LinkList p=L-next;
if(!p)
{
printf("the Link L is empty\n");
}
while(p)
{
printf("%d\n",p-data);
p=p-next;
}
}
//鏈表長度函數(shù)
int LengthLink(LinkList L)
{
int i=0;
LinkList p=L-next;
while(p)
{
p=p-next;
i++;
}
return i;
}
//合并函數(shù)
void MergeLink(LinkList L1,LinkList L2)
{
int i=0,flag=0;
LinkList p1=L1-next,p2=L2-next;
LinkList p=(LinkList)malloc ((LengthLink(L1)+LengthLink(L2)+2)*sizeof(LNode));
LinkList pre=p;
if (!p)
{
printf("MergeLink error\n");
return;
}
p-next=NULL;
while (p1p2)
{
if (p1-data=p2-data)
{
InsertLink(p,i++,p2-data);
p2=p2-next;
}
else
{
InsertLink(p,i++,p1-data);
p1=p1-next;
}
}
while (p1)
{
InsertLink(p,i++,p1-data);
p1=p1-next;
}
while(p2)
{
InsertLink(p,i++,p2-data);
p2=p2-next;
}
while(pre)
{
pre=pre-next;
}
LinkList q=L1;
L1=p;
DestroyLink(q);
DestroyLink(L2);
}
C語言創(chuàng)建單鏈表如下:
#include"stdio.h"
#include"stdlib.h"
#include"malloc.h"
#include "iostream.h"
typedef struct node
{
int??data;
node * next;
}node , * List;
void create(int n)
{
int c;
List s,L;
L=(List)malloc(sizeof(node));
L-next=NULL;
printf("請輸入第1個(gè)數(shù)據(jù):");
scanf("%d",c);
L-data=c;
for(int i=2;i=n;i++)
{
s=(List)malloc(sizeof(node));
printf("請輸入第%d個(gè)數(shù)據(jù):",i);
scanf("%d",c);
s-data=c;
s-next=L;
L-next =s;
}
printf("鏈表創(chuàng)建成功!");
}
void main()
{
int n;
printf("請你輸入鏈表的個(gè)數(shù):");
scanf("%d",n);
create(n);
}
單鏈表創(chuàng)建方法:
單鏈表的建立有頭插法、尾插法兩種方法。
1. 頭插法
單鏈表是用戶不斷申請 存儲(chǔ)單元和改變鏈接關(guān)系而得到的一種特殊 數(shù)據(jù)結(jié)構(gòu),將鏈表的左邊稱為鏈頭,右邊稱為鏈尾。頭插法建單鏈表是將鏈表右端看成固定的,鏈表不斷向左延伸而得到的。頭插法最先得到的是尾結(jié)點(diǎn)。
由于鏈表的長度是隨機(jī)的,故用一個(gè)while循環(huán)來控制鏈表中結(jié)點(diǎn)個(gè)數(shù)。假設(shè)每個(gè)結(jié)點(diǎn)的值都大于O,則循環(huán)條件為輸入的值大于o。申請 存儲(chǔ)空間可使用malloc()函數(shù)實(shí)現(xiàn),需設(shè)立一申請單元 指針,但malloc()函數(shù)得到的指針并不是指向?結(jié)構(gòu)體的指針,需使用 強(qiáng)制類型轉(zhuǎn)換,將其轉(zhuǎn)換成結(jié)構(gòu)體型指針。剛開始時(shí),鏈表還沒建立,是一空鏈表,head 指針為NULL。
鏈表建立的過程是申請空間、得到數(shù)據(jù)、建立鏈接的循環(huán)處理過程。
2. 尾插法
若將鏈表的左端固定,鏈表不斷向右延伸,這種建立鏈表的方法稱為尾插法。尾插法建立鏈表時(shí),頭 指針固定不動(dòng),故必須設(shè)立一個(gè)搜索指針,向鏈表右邊延伸,則整個(gè)算法中應(yīng)設(shè)立三個(gè)鏈表指針,即頭指針head、搜索指針p2、申請單元指針pl。尾插法最先得到的是?頭結(jié)點(diǎn)。
#includestdio.h
#includewindows.h
#include stdio.h
#include malloc.h
#include stdlib.h
//定義數(shù)據(jù)類型名稱
typedef int DataType;
#define flag -1?? ??? ?//定義數(shù)據(jù)輸入結(jié)束的標(biāo)志數(shù)據(jù)
//單鏈表結(jié)點(diǎn)存儲(chǔ)結(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;?? ??? ?//定義指向當(dāng)前插入元素的指針
while(1)
{
scanf("%d",x);
if(-1==x)
{?? return head;
break;}
s= (LNode *)malloc(sizeof(LNode));?? ??? ?//為當(dāng)前插入元素的指針分配地址空間
s-data =x;
s-next =NULL;
i++;
if(i==1)
head=s;
else
L-next =s;
L=s;
}
}
//查找子函數(shù)(按序號(hào)查找)
LNode *Get_LinkList(LinkList L,int i)
{
LNode *p;
int j;?? ??? ?//j是計(jì)數(shù)器,用來判斷當(dāng)前的結(jié)點(diǎn)是否是第i個(gè)結(jié)點(diǎn)
p=L;
j=1;
while(p!=NULLji)
{
p=p-next ;?? ??? ?//當(dāng)前結(jié)點(diǎn)p不是第i個(gè)且p非空,則p移向下一個(gè)結(jié)點(diǎn)
j++;
}
return p;
}
//插入運(yùn)算子函數(shù)
void Insert_LinkList(LinkList L,int i,DataType x)?? ??? ?//在單鏈表L中第i個(gè)位置插入值為x的新結(jié)點(diǎn)
{
LNode *p,*s;
p =Get_LinkList(L,i);?? ??? ?//尋找鏈表的第i-1個(gè)位置結(jié)點(diǎn)
if(p==NULL)
{
printf("插入位置不合法!");
exit(-1);
}
else
{
s= (LinkList)malloc(sizeof(LNode));?? ??? ?//為當(dāng)前插入元素的指針分配地址空間
s-data =x;
s-next =p-next ;
p-next =s;
}
}
//單鏈表的刪除運(yùn)算子函數(shù)
void Delete_LinkList(LinkList L,int i)?? ??? ?//刪除單鏈表上的第i個(gè)結(jié)點(diǎn)
{
LNode *p,*q;
p=Get_LinkList(L,i-1);?? ??? ?//尋找鏈表的第i-1個(gè)位置結(jié)點(diǎn)
if(p==NULL)
{
printf("刪除的位置不合法!");?? ??? ?//第i個(gè)結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)不存在,不能執(zhí)行刪除操作
exit(-1);
}
else
{
if(p-next ==NULL)
{
?printf("刪除的位置不合法!");?? ??? ?//第i個(gè)結(jié)點(diǎn)不存在,不能執(zhí)行刪除操作
?exit(-1);
}
else
{
?q=p-next ;
?p-next =p-next-next;
?free(q);
}
}
}
//求表長運(yùn)算子函數(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("請輸入選項(xiàng):");
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)建給改了一下