使用C语言实现链表的创建,删除,查找,插入
重要的知识点介绍:
一:
1|Status ListInsert_L(linklist &L,int i,ElemType e)//在第i个位置插入e元素
有些函数参数前带&号:
&号就是取地址,传递变量的指针,使形参得到一个变量的地址,这时形参指针变量指向实参变量单元,如果我们对带有&号的变量进行更改,那么主函数中相应变量也会一起改变
二:
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode ,*linklist;
在定义节点时,LNode *p ,linklist p的意思是一样的
三:所有代码如下
#include<stdio.h>
#include<stdlib.h>
#define ERROR 0
#define OK 1
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode ,*linklist;
void CreateList_L(linklist &L,int n)
{
L= (linklist) malloc (sizeof(LNode));
L->next = NULL;
int i;
LNode *p;
for (i=n;i>0;i--)
{
p=(linklist) malloc (sizeof(LNode));
scanf ("%d",&(p->data));
p->next=L->next;L->next=p;
}
}
void OutputLNode(linklist L)
{
/*LNode *p = L->next;//初始化指针
while (p)
{
printf("%d ",p->data);
p = p->next;
}*/
L=L->next;
while (L)
{
printf ("%d ",L->data);
L=L->next;
}
//两种初始化方法都可以
}
Status GetElem_L(linklist L,int i,ElemType &e) //查找第i位置上的元素
{
LNode *p;
int j;
p=L->next;//初始化指针指向第一个节点
j=1;//计数器,计算查找次数
while (p&&j<i)//顺时针向后查找, 直到p指向第i个元素或p为空
{
p=p->next;
++j;
}
if (!p||j>j) return ERROR;//没有此元素
e = p->data;
return OK;
}
Status ListInsert_L(linklist &L,int i,ElemType e)//在第i个位置插入e元素
{
LNode *p,*s;
int j=0;
p=L;
while (p&&j<i-1)
{
p=p->next;++j;
}
if (!p||j<i-1) return ERROR;
s= (linklist)malloc(sizeof(LNode));
s->data= e;
s->next= p->next;p->next = s;
return OK;
}
Status ListDelete_L(linklist &L,int i,ElemType &e)//删除第i个元素,并用e返回其值
{
LNode *p,*q;
int j=0;
p=L;
while (p->next&&j<i-1)//寻找第i个节点
{
p=p->next ;
++j;
}
if (!(p->next)||j>i-1) return ERROR;//删除位置不合理
q=p->next ; p->next = q->next;
e = q->data;
free(q);
return OK;
}
int main()
{
LNode *L;
//printf (" some number");
CreateList_L(L,4);
printf ("表中的元素依次为:\n");
OutputLNode(L);
ElemType e;
GetElem_L(L,2,e);
printf ("将56插入表中第二个位置:\n");
ListInsert_L(L,2,56);
OutputLNode(L);
printf ("删除第三个元:\n");
ListDelete_L(L,3,e);
OutputLNode(L);
system("pause");
return OK;
}