实现单链表
Posted yshun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现单链表相关的知识,希望对你有一定的参考价值。
因为在传递函数参数时,使用了引用,所以该程序为C++程序
#include <stdio.h>
#include <stdlib.h>
#define ElemType int
typedef struct LNode
ElemType data;
struct LNode *next;
int length;
LNode, *LinkList;
int CreatList(LinkList &L)
L=(LinkList)malloc(sizeof(LNode));
if(L==NULL)printf("创建失败");return 0;
L->next=NULL;
return 1;
//创建一个链表的头结点
void ListTailInsert(LinkList &L,ElemType e)
LinkList r,s;
r=L;
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=NULL;
while(r->next!=NULL)
r=r->next;
r->next=s;
//尾插法填充节点
void ListPrint(LinkList &L)
LinkList p;
int i=0;
p=L->next;
printf("链表为:");
while(p!=NULL)
printf("%d ",p->data);
p=p->next;
i++;
printf("\\n");
L->length=i;
printf("链表的长度为:%d\\n",L->length);
//打印链表
LNode *GetElem(LinkList &L,int i)
int j=1;
LinkList p=L->next;
if(i<1||i>L->length)
printf("寻找的i的位置无效");
while(p!=NULL)
if(j==i)return p;
p=p->next;
j++;
//查找第i个结点
LNode *LocateElem(LinkList &L,ElemType e)
LinkList p=L->next;
int flag=0;
while(p!=NULL)
if(p->data==e)flag=1;return p;
p=p->next;
if(flag==0)printf("未找到该结点");
//按值查找表节点并返回该结点
void ListInsert(LinkList &L,int i,ElemType e)
LinkList s,p;
if(i<0||i>L->length)printf("插入的i的位置无效");
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
if(i==1)
s->next=L->next;
L->next=s;
//在第一个结点插入的特殊情况
elsep=GetElem(L,i-1);
s->next=p->next;
p->next=s;
//将结点值为e的
void ListDelete(LinkList &L,int i)
LinkList p;
if(i<0||i>L->length)printf("删除的i的位置无效");
if(i==1)
L->next=L->next->next;
//在第一个结点删除的特殊情况
elsep=GetElem(L,i-1);
p->next=p->next->next;
//删除第i个结点
int main()
LinkList L;
LinkList q;
LinkList p;
CreatList(L);
ListTailInsert(L,1);
ListTailInsert(L,2);
ListTailInsert(L,3);
ListTailInsert(L,4);
ListTailInsert(L,5);
ListPrint(L);
q=LocateElem(L,2);
printf("%d\\n",q->data);
p=GetElem(L,3);
printf("%d\\n",p->data);
ListInsert(L,1,6);
ListInsert(L,3,7);
ListPrint(L);
ListDelete(L,1);
ListDelete(L,5);
ListPrint(L);
return 0;
下面为运行结果
以上是关于实现单链表的主要内容,如果未能解决你的问题,请参考以下文章
数据结构学习笔记(单链表单循环链表带头双向循环链表)的增删查改排序等)
[Data Structure]线性表Linear List2