本文目录一览:
- 1、C语言创建链表,函数调用部分
- 2、C语言中链表是怎样调用的?
- 3、用C语言实现链表的算法
- 4、C语言链表的使用方法
- 5、链表的使用,c语言
- 6、C语言链表操作
C语言创建链表,函数调用部分
#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语言中链表是怎样调用的?
-运算是间接寻址,你用多指针的话会发现指针用-这种调用方式更简洁
链表指针是C语言的一个难点,但也是重点,学懂了非常有用。要仔细讲就必须先讲变量、指针。
什么是变量?所谓变量,不要浅显的认为会变得量就是变量。举个例子:“教室变不变?”变,因为每天有不同的人在里面上课,但又不变,因为教室始终在那,没有变大或变小。这就是变量:有一个不变的地址和一块可变的存储空间。正常情况下,我们只看到变量这个房间里面的东西,也就是其内容,但不会关注变量的地址,但是C语言的指针,就是这个房间的地址。我们声明变量就相当于盖了间房子存放东西,我们可以直接观看房子里的东西,而声明指针,就是相当于获得了一个定位器,当用指针指向某个变量时,就是用指针给变量定位,以后我们就可以用指针找到他所“跟踪”的变量并可以获得里面的内容。
至于我们写代码的结构体就相当于是有好几个房子组成的别墅,几个房子绑定在一起使用。假设现在有很多这种别墅分布在一个大迷宫里,每间别墅里都有一间房子。里面放了另一个别墅的位置信息,现在你手拿定位器找到了第一栋别墅,从里面得到了你想要的东西(链表的数据部分),然后把下一栋别墅的位置计入你的定位器(p
=
p-next),再走向下一栋别墅……如此走下去,知道走到某地下一栋别墅信息没有了(p-next
==
NULL),你的旅行结束。这就是链表一次遍历的过程。
aTdPage[ucTdPageIndex]-OnInit
();就相当于一个定位器
用C语言实现链表的算法
这个是我们数据结构上机实验的链表问题,
#includestdio.h
#includemalloc.h
#define
LEN
sizeof(LinkNode)
typedef
int
Datatype;
typedef
int
Status;
typedef
struct
LinkNode{
Datatype
data;
struct
LinkNode
*next;
}
LinkNode,*LinkList;
typedef
struct
OrderedList
{
LinkNode
*head,*tail;
int
Listsize;
}
OrderedList;//有序循环链表的头节点head,尾接接节点
tail及长度Listsize
Status
InitList(OrderedList
*List)//生成循环链表头节点
{
List-tail=List-head=(LinkList)malloc(LEN);
if(List-head==NULL)
return
0;
else
{
List-head-next=List-tail;
List-tail-next=List-head;
List-Listsize=0;
return
1;
}
}
void
OrderedInsert(OrderedList
*List,Datatype
data)//每调用一次有序插入data形成有序的(从小到大)的链表
{
LinkNode
*p
,*q;
if(List-head==List-tail-next)
{
p=(LinkNode*)malloc(LEN);
p-data
=
data;
List-head-next=p;
p-next=List-tail;
List-Listsize++;
}
else
{
p=List-head-next;
q
=
List-head;
while(p-datadatap!=List-tail)
{
q
=
p;
p=p-next;
}
if(p-data==data)
{printf("YOu
have
input
the
same
datas
%d\n\t
YOu
should
input
another
data
\n",data);
scanf("%d",data);
OrderedInsert(List,data);
}
else
{
p=(LinkNode*)malloc(LEN);
p-data
=
data;
p-next
=
q-next;
q-next
=
p;
List-Listsize++;
}
}
}
void
Creatset(OrderedList
*List)//多次调用OrderedInsert()生成有序链表即集合List
{
Datatype
data;
int
setsize
,
i=0;
printf("Please
input
the
setsize
you
want
to
creat:\n");
scanf("%d",setsize);
InitList(List);
if(setsize==0)
printf("You
needen't
input
any
data\n");
else
if(setsize==1)
printf("Please
input
a
single
data\n");
else
printf("Please
input
%d
different
datas;\n",setsize);
while(isetsize||setsizeList-Listsize)//当循环次数i小于setsize或者集合内实际元素数List.Listsize小于setsize时一直循环下去
{
scanf("%d",data);
OrderedInsert(List,data);
i++;
}
}
void
Append(OrderedList
*List,Datatype
data)//在循环链表的最后面追加
一个data
{
LinkNode
*p;
p=(LinkNode*)malloc(LEN);
p-data=data;
List-tail=List-tail-next=p;
List-tail-next=List-head;
List-Listsize+=1;
}
void
MergeList(OrderedList
La,OrderedList
Lb,OrderedList
*Lc)//有序循环链表ListLa,ListLb求并集生成ListLc
{
LinkList
Pa,Pb;
Pa=La.head-next;Pb=Lb.head-next;
while(Pa!=La.tailPb!=Lb.tail)
{
if(Pa-data=Pb-data)
{
Append(Lc,Pa-data);
Pa=Pa-next;
}
else
{
Append(Lc,Pb-data);Pb=Pb-next;
}
}
while(Pa!=La.tail)
{
Append(
Lc,Pa-data);Pa=Pa-next;}
while(Pb!=Lb.tail)
{
Append(Lc,Pb-data);Pb=Pb-next;}
}
void
Print(OrderedList
List)
{
LinkNode
*p;
p=List.head-next;
if(p-next==List.head)
printf("No
Elem\n");
while(p!=List.head)
{
printf("%5d",p-data);p=p-next;
}
printf("\n");
}
void
main()
{
OrderedList
ListLa,ListLb,ListLc;
Creatset(ListLa);
Creatset(ListLb);
InitList(ListLc);
MergeList(ListLa,ListLb,ListLc);
printf("The
orgnial
list
ListLa,ListLb:\n");
Print(ListLa);
Print(ListLb);
printf("The
Merge
list
ListLc;\n");
Print(ListLc);
}
C语言链表的使用方法
下面的程序是单链表的建立与输出,都有详细的注释,相信你能看的懂
但要想学习链表必须得掌握了一定的C语言基础
下面这个链表的作用是建立5个结点的单链表,5个结点的值输入以后,依次输出各个结点的值
#includestdio.h
#includestdlib.h
//链表的建立与输出
struct node//定义结点的类型
{
int num,score;
node*link;
};
void main()
{
node*creat(int n);//函数原型声明
void print(node*h);//函数原型声明
node*head=0;//定义链头指针并初始化
head=creat(5);//调用creat函数创建链表
print(head);//调用print函数输出链表
}
node*creat(int n)
{
node*h=0,*p,*q;
int i;
for(i=1;i=n;i++)
{
q=(node*)malloc(sizeof(node));//分配一个结点空间
scanf("%d%d",q-num,q-score);//输入新结点的值
q-link=0;//新结点的指针域置0
if(h==0)
h=q;//第一个结点作为链头结点
else
p-link=q;//新结点添加到链表的末尾
p=q;
}
return h;//返回链头指针
}
void print(node*h)//链表输出函数的定义
{
while(h)//当指针h非空时输出h所指结点的值
{
printf("num=%d\tscore=%d\n",h-num,h-score);
h=h-link;//使h指向下一个结点
}
}
链表的使用,c语言
#includestdio.h
#includestdlib.h
typedef struct Node
{
int data;
struct Node*next;
}node,*Llist;
Llist creat(int n)
{
int i;
Llist head,p,q;
head=(node*)malloc(sizeof(node));
p=q=head;
head-next=NULL;
for(i=0;in;i++)
{
p=(node*)malloc(sizeof(node));
scanf("%d",p-data);
p-next=q-next;
q-next=p;
q=p;
}
return head;
}//建立链表函数//
int main()
{
Llist la,lb,lc;
node *p,*q,*r;
int m,n;
printf("请分别输入A与B链表的长度:");
scanf("%d%d",m,n);
printf("请输入A链表的数据(递增):");
la=creat(m);
printf("请输入B链表的数据(递增):");
lb=creat(n);
q=la;
p=la-next;
r=lb-next;
while(p!=NULLr!=NULL)
{
if((p-data)==(r-data))
{
q-next=p-next;
free(p);
p=q-next;
r=r-next;
}//当两值相等时均向后移动一位,并释放A中相等结点//
else if((p-data)(r-data))
{
q=p;
p=p-next;
}//a链表中结点小于b时,a向后移动一位//
else
r=r-next;//b链表中结点小于a时,b向后移动一位//
}
lc=la;
p=lc-next;
printf("A-B的结果为:");
while(p!=NULL)
{
printf("%d ",p-data);
p=p-next;
}
return 0;
}
C语言链表操作
typedefstruct_List{intdata;struct_List*next;}List;intQuery(List**head,intx){List*p=(*head)-next;intn=1;while(pp-data!=x){p=p-next;n++;}if(p)returnn;elsereturn-1;}