十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
如果不用指针的指针的话,那么InitList_L中的L将只是实际链表头指针的值拷贝,如果执行L=(LinkList)malloc(sizeof(LNode));的话, 这个L在函数结束后就被释放了,实际链表头指针的值仍没有变.
网站设计制作过程拒绝使用模板建站;使用PHP+MYSQL原生开发可交付网站源代码;符合网站优化排名的后台管理系统;成都网站制作、成都网站设计、外贸营销网站建设收费合理;免费进行网站备案等企业网站建设一条龙服务.我们是一家持续稳定运营了10多年的创新互联公司网站建设公司。
一句话,不要看见指针就以为是指针传递,当想改变的变量是指针时,指针传递就必需传递指针的指针.
#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;
}
}
}
我把创建给改了一下
C语言创建单链表如下:
#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个数据:");
scanf("%d",c);
L-data=c;
for(int i=2;i=n;i++)
{
s=(List)malloc(sizeof(node));
printf("请输入第%d个数据:",i);
scanf("%d",c);
s-data=c;
s-next=L;
L-next =s;
}
printf("链表创建成功!");
}
void main()
{
int n;
printf("请你输入链表的个数:");
scanf("%d",n);
create(n);
}
单链表创建方法:
单链表的建立有头插法、尾插法两种方法。
1. 头插法
单链表是用户不断申请 存储单元和改变链接关系而得到的一种特殊 数据结构,将链表的左边称为链头,右边称为链尾。头插法建单链表是将链表右端看成固定的,链表不断向左延伸而得到的。头插法最先得到的是尾结点。
由于链表的长度是随机的,故用一个while循环来控制链表中结点个数。假设每个结点的值都大于O,则循环条件为输入的值大于o。申请 存储空间可使用malloc()函数实现,需设立一申请单元 指针,但malloc()函数得到的指针并不是指向 结构体的指针,需使用 强制类型转换,将其转换成结构体型指针。刚开始时,链表还没建立,是一空链表,head 指针为NULL。
链表建立的过程是申请空间、得到数据、建立链接的循环处理过程。
2. 尾插法
若将链表的左端固定,链表不断向右延伸,这种建立链表的方法称为尾插法。尾插法建立链表时,头 指针固定不动,故必须设立一个搜索指针,向链表右边延伸,则整个算法中应设立三个链表指针,即头指针head、搜索指针p2、申请单元指针pl。尾插法最先得到的是 头结点。
主函数这里
Linklist List;
printf("输入创建链表的长度:");
scanf("%d",num);
CreateList_H(List,num); //创建链表
改为
LNode List;
printf("输入创建链表的长度:");
scanf("%d",num);
CreateList_H(List,num); //创建链表
函数内在堆上分配好内存,但是 没有传递到栈上
另外 你的变量名很迷人