今天给各位分享c语言链表定义的知识,其中也会对c语言链表定义学生信息增删改查进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
1、c语言链表,求用通俗的话解释2、C语言链表概念3、C语言中怎么定义链表,最好把各个代码都详细的解释一下!4、C语言 建立链表(链表的结点类型与成员个数等由学生自己定义)
c语言链表,求用通俗的话解释
链表是一种常见的重要的数据结构.它是动态地进行存储分配的一种结构.我们知道,用数组存放数据时,
必须事先定义固定的长度(即元素个数).比如,有的班级有100人,而有的班只有30人,如果要用同一个数组先后存放不同班级的学生数据,则必须定义长度为100的数组.如果事先难以确定一个班的最多人数,则必须把数组定得足够大,以能存放任何班级的学生数据.显然这将会浪费内存.链表则没有这种缺点,它根据需要开辟内存单元.图10.11表示最简单的一种链表(单向链表)的结构.链表有一个”头指针”变量,图中以head表示,它存放一个地址.
该地址指向一个元素.链表中每一个元素称为”结点”,每个结点都应包括两个部分:一为用户需要用的实际数据,二为下一个结点的地址.课以看出,head指向第一个元素;第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为’表尾”,它的地址部分放一个”NULL”(表示”空地址”).链表到此结束.
可以看到:链表中各元素在内存中可以不是连续存放的.要找某一元素,必须先找到上一个元素,根据它提供的下一元素地址才能找到下一个元素.
如果不提供”头指针”(head),则整个链表都无法访问.链表如同一条铁链一样,一环扣一环,中间是不能断开的.打个通俗的比方:幼儿园的老师带领孩子出来散步,老师牵着第一个小孩的手,第一个小孩的另一只手牵着第二个孩子,……,这就是一个”链”,最后一个孩子有一只手空着,他是”链尾”.要找这个队伍,必须先找到老师,然后顺序找到每一个孩子.
C语言链表概念
简单说来,就是通过指针指向,把两个结构体连接起来。比如定义下面这个结构体
struct node
{
int data;
struct node *next;
}
可以看到结构体里面定义了一个自身类型的指针,通过让指针指向另外一个结构体,我们就能通过结构体里面的next变量访问下个结构体里面的内容,而通过下一个结构体,同样可以通过下一个结构体的next指向,找到下一个这种类型的结构体,这样就形成了所谓的链表。
C语言中怎么定义链表,最好把各个代码都详细的解释一下!
/*creat
a
list*/
#include
“stdlib.h”
#include
“stdio.h”
struct
list
{
int
data;
struct
list
*next;
};
typedef
struct
list
node;
typedef
node
*link;
void
main()
{
link
ptr,head;
int
num,i;
ptr=(link)malloc(sizeof(node));
ptr=head;
printf(“please
input
5
numbers==\n”);
for(i=0;i=4;i++)
{
scanf(“%d”,num);
ptr-data=num;
ptr-next=(link)malloc(sizeof(node));
if(i==4)
ptr-next=NULL;
else
ptr=ptr-next;
}
ptr=head;
while(ptr!=NULL)
{
printf(“The
value
is
==%d\n”,ptr-data);
ptr=ptr-next;
}
}
上面是一个简单的创建链表的C程序。所谓链表形象的讲就是一个数据块里面存有数据,并且存有下一个数据的指针,这样一个指一个形成一个数据链。这个数据链可以被操作,例如插入数据,删除数据,等。至于指令,首先定义一个结构体,它存有数据和指向下一个数据块的指针。然后分配空间。注意最后一个为NULL,当然你也可以指向开头一个数据块形成一个循环链表。
C语言 建立链表(链表的结点类型与成员个数等由学生自己定义)
#include”stdio.h”
#include”string.h”
#include”stdlib.h”
#include”malloc.h”
#include”conio.h”
/*定义DataType为int类型*/
typedef int DataType;
#define TRUE 1
#define FALSE 0
/*单链表的结点类型*/
typedef struct LNode
{DataType data; br/ struct LNode *next; br/ }LNode,*LinkedList;
/*初始化单链表*/
LinkedList LinkedListInit()
{LinkedList L; br/ L=(LinkedList)malloc(sizeof(LNode)); br/ L-next=NULL;br/ printf(“初始化单链表成功\n”); br/ return L; br/}
/*清空单链表*/
void LinkedListClear(LinkedList L)
{L-next=NULL; br/ printf(“链表已经清空\n”); br/}
/*检查单链表是否为空*/
int LinkedListEmpty(LinkedList L)
{if(L-next==NULL) br/ {printf(“单链表为空\n”); return TRUE;}
else
{printf(“单链表非空\n”);return FALSE;}
}
/*遍历单链表*/
void LinkedListTraverse(LinkedList L)
{LinkedList p; br/ p=L-next; br/ if(p==NULL) br/ printf(“单链表为空表\n”); br/ else br/ {printf(“链表中的元素为:\n”); br/ while(p!=NULL) br/ {printf(“%d “,p-data); p=p-next;}
}
printf(“\n”);
}
/*求单链表长度*/
int LinkedListLength(LinkedList L)
{LinkedList p; br/ int j; br/ p=L-next; br/ j=0; br/ while(p!=NULL) br/ { j++; p=p-next;}
return j;
}
/*从链表中查找元素*/
LinkedList LinkedListGet(LinkedList L,int i)
{LinkedList p;br/ p=L-next;int j=1; br/ while(pji) {p=p-next; j++;}
if(p) printf(“位序为%d的元素的值为%d\n”,i,p-data);
else printf(“查询位置不正确\n”);
}
/*从链表中查找与给定元素值相同的元素在顺序表中的位置*/
int LinkedListLocate(LinkedList L,DataType x)
{LinkedList p;int i=1; br/ p=L-next; br/ while(p p-data != x) {p=p-next;i++;}
if(p) {printf(“所查找的元素%d在表中的位置为%d\n”,x,i);return i; }
else {printf(“所查找的元素%d不存在\n”,x);return 0; }
}
/*向链表中插入元素*/
void LinkedListInsert(LinkedList L, int i, DataType x)
{LinkedList p,s;br/ int j=0; p=L; br/ while(pji) {p=p-next;j++;}
if(!p||ji) printf(“插入位置不正确\n”);
else
{s=(LNode *)malloc(sizeof(LNode)); br/ s-data=x; br/ s-next=p-next; br/ p-next=s; br/ printf(“在表中第%d个节点后插入%d成功\n”,i,x); br/ }
}
/*从链表中删除元素*/
void LinkedListDel(LinkedList L,int i)
{ LinkedList p,q;
int j=0;
p=L;
while(p-nextji-1) {p=p-next;j++;}
if(p-next==NULL)
printf(“删除位置不正确\n”);
else
{q=p-next;p-next=q-next;free(q);br/ printf(“第%d个元素已从链表中删除\n”,i);br/ }
}
/*最后改好的将头插发改为尾插法了*/
LinkedList LinkedListCreat(LinkedListL,int n) /*建立单链表*/
{ int i;
DataType x;
LinkedList p;
L=(LinkedList)malloc(sizeof(LNode));
L-next=NULL;
for(i=n;i0;–i)
{p=(LinkedList)malloc(sizeof(LNode));br/ printf(“请依次输入链表中的元素:”);br/ scanf(“%d”,x);br/ p-data=x;br/ p-next=L-next;L-next=p;br/ }
printf(“输入完毕\n”);
return L;
}
main()
{printf(“请用数字键选择操作\n\n”);br/ printf(“1.初始化\n”);br/ printf(“2.建立单链表\n”);br/ printf(“3.清空\n”);br/ printf(“4.求链表长度\n”);br/ printf(“5.检查链表是否为空\n”);br/ printf(“6.遍历链表\n”);br/ printf(“7.从链表中查找元素\n”);br/ printf(“8.从链表中查找与给定元素值相同的元素在顺序表中的位置\n”);br/ printf(“9.向链表中插入元素\n”);br/ printf(“0.从链表中删除元素\n\n”);br/ printf(“按其他键退出\n”); br/ br/LinkedList L;br/int i,x,n,quit=0;br/while(!quit)br/switch(getch()) br/{br/case ‘1’:L=LinkedListInit(); break;br/case ‘2’:printf(“请输入需要的链表的长度为:”);scanf(“%d”,n);L=LinkedListCreat(L,n); break; br/case ‘3’:LinkedListClear(L);break; br/case ‘4’:printf(“链表的长度为 %d(不含头节点)\n”,LinkedListLength(L)); break; br/case ‘5’:LinkedListEmpty(L); break; br/case ‘6’:LinkedListTraverse(L); break; br/case ‘7’:printf(“请输入待查询元素在链表中的位置:”);scanf(“%d”,i);LinkedListGet(L,i); break; br/case ‘8’:printf(“请输入待查询元素的值:”); scanf(“%d”,x); LinkedListLocate(L,x); break; br/case ‘9’:printf(“请输入插入元素的位置和值(中间用逗号隔开):\n”); scanf(“%d,%d”,i,x); br/ LinkedListInsert(L,i,x); break; br/case ‘0’:if(LinkedListEmpty(L)==1) printf(“链表已经为空,不能删除\n”);br/ else printf(“请输入待删除元素的位置:\n”); scanf(“%d”,i); LinkedListDel(L,i);br/ break; br/br/default:quit=1; br/}
}
c语言链表定义的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言链表定义学生信息增删改查、c语言链表定义的信息别忘了在本站进行查找喔。