众所周知,链表是数据结构中线性表的知识,线性表有两种存储结构,一种是顺序存储(顺序表),一种是链式存储(链表)。现在给出链表中常用基本操作的c语言代码实现。
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode //定义链表类型
{
ElemType data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;
void CreateList(LinkList &L,int n) //初始化链表
{ int i;
LinkList p,r; //p表示指向当前节点的指针
L=(LinkList )malloc(sizeof(LNode));
L->next=NULL; //建立头结点
L->data=0; //表头数据域放的是长度
r=L; //创建尾结点
printf("输入n个数放到链表里:\n");
for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(LNode)); //为新建立的节点申请空间
scanf("%d",&p->data); //输入数据
L->data++;
r->next=p; //把新建的节点放到尾解点之后
r=p; //新建的节点等于尾解点
}
}
void print(LinkList L) //链表的打印函数
{ int i;LinkList p;
p=L->next;
for(i=0;i<L->data;i++)
{printf("%d ",p->data);
p=p->next;
}
}
int GetElem(LinkList L,int i,ElemType &e) //从链表中获取元素
{ int j=1;
LinkList p;
p=L->next;
if(!p||i>L->data) //如果表为空或查询位置超出长度
return 0;
while(p&&j<i) //将p移到要找到的位置
{ p=p->next;
j++;
}
e=p->data; //找到后赋值
return 1;
}
int ListInsert(LinkList &L,int i,ElemType e) //链表节点的插入
{ LinkList p,s;
int j=0; //j为循环变量
p=L; //p为当前节点的指针
while(p&&j<i-1)
{ p=p->next;
j++;
}
if(!p||i>L->data+1) //如果表为空或查询位置超出长度
return 0;
s=(LinkList)malloc(sizeof(LNode)); //创建新节点
s->data=e; //新节点赋值
s->next=p->next;
p->next=s;
L->data++; //插入完之后长度加1
return 1;
}
int ListDelete(LinkList &L,int i,ElemType &e) //链表节点的删除
{
LinkList p,s; //p为要删除的前一个节点,s为要删除的节点
int j=0;
p=L;
if(!p||i>L->data) //如果表为空或查询位置超出长度
return 0;
while(p&&j<i-1) //p移动到正确位置
{ p=p->next;
j++;
}
s=p->next; //s移动到正确位置
e=s->data; //把删除的数据赋值给e
p->next=s->next;
L->data--;
free(s); //释放节点
return 1;
}
int LocateElem(LinkList L,ElemType e) //在链表中查找与e相等的元素并返回元素位置
{ int i;
LinkList p;
p=L->next;
for(i=0;i<L->data;i++)
{
if(p->data==e)
return i+1;
p=p->next;
}
return 0;
}
int DestoryList(LinkList &L) //链表的销毁
{
LinkList p;
if(L=NULL)
return 0;
while(L)
{ p=L->next;
free(L);
L=p;
}
return 1;
}
void menu()
{ printf("\n-------------------------------------1.构造一个新链表----------------------------------------------------------");
printf("\n-------------------------------------2.向表中插入元素----------------------------------------------------------");
printf("\n-------------------------------------3.向表中删除元素----------------------------------------------------------");
printf("\n-------------------------------------4.获取表中元素------------------------------------------------------------");
printf("\n-------------------------------------5.打印表中元素-------------------------------------------------------------");
printf("\n-------------------------------------6.获取链表长度----------------------------------------------------------");
printf("\n-------------------------------------7.销毁链表-------------------------------------------------------------");
}
int main()
{ ElemType e;
LinkList L;
int m,choose,location;
menu();
p:
printf("\n请输入你的选项: ");
scanf("%d",&choose);
switch(choose)
{ case 1: printf("输入要创建链表的元素个数n:"); scanf("%d",&m);CreateList(L,m);goto p; //创建m个长度的链表
case 2:printf("\n请输入要插入元素的位置:");scanf("%d",&location);printf("\n请输入要插入的元素:");scanf("%d",&e);ListInsert(L,location,e);goto p;
case 3:printf("\n请输入要删除元素的位置:");scanf("%d",&location);ListDelete(L,location,e);printf("\n被删除的数是%d\n",e); goto p;
case 4:printf("\n请输入要获取元素的位置:");scanf("%d",&location);GetElem(L,location,e);printf("\n获取到的数是%d\n",e); goto p;
case 5:print(L); goto p;
case 6:printf("表长为:%d",L->data); goto p;
case 7:DestoryList(L);printf("\n线性表已被销毁"); goto p;
default:printf("输入错误,请重新输入"); goto p;
}
return 0;
}
上述便为常见的链表操作代码。
下面给出运行结果图