数据结构之单链表实现
代码及思想
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
LNode *LinkListInit();
LinkList LinkListCreateH();
LinkList LinkListCreateT();
int LinkListLength();
LinkList LinkListInsert(LinkList L,int i,ElemType e);
LinkList LinkListDelete(LinkList L,ElemType e);
void LinkListTraverse(LinkList L);
LNode *LinkListInit()
{
LNode *L = (LNode*)malloc(sizeof(LNode));
if(L==NULL)
{
cout<<"*申请空间失败"<<endl;
}
L->next = NULL;
return L;
}
LinkList LinkListCreateH()
{
LNode *L;
L = (LNode *)malloc(sizeof(LNode));
L->next = NULL;
ElemType x;
while(scanf("%d",&x) != EOF)
{
LNode *p;
p = (LNode *)malloc(sizeof(LNode));
p->data = x;
p->next = L->next;
L->next = p;
}
return L;
}
LinkList LinkListCreateT()
{
LNode *L = (LNode *)malloc(sizeof(LNode));
L->next = NULL;
LNode *T = L;
ElemType x;
while(scanf("%d",&x) != EOF)
{
LNode *p = (LNode *)malloc(sizeof(LNode));
p->data = x;
T->next = p;
T = p;
}
T->next = NULL;
return L;
}
int LinkListLength(LinkList L)
{
int length = 0;
LNode *temp = L;
while(temp->next != NULL)
{
temp = temp->next;
length++;
}
return length;
}
LinkList LinkListInsert(LinkList L,int i,ElemType e)
{
LNode *node = (LNode *)malloc(sizeof(LNode));
node->data = e;
LNode *temp = L;
if(i > LinkListLength(L))
{
cout<<"*请检查插入位置的合法性"<<endl;
return NULL;
}
for(int j=1;j<i;j++)
{
temp = temp->next;
}
node->next = temp->next;
temp->next = node;
return L;
}
LinkList LinkListDelete(LinkList L,ElemType e)
{
LNode *p = L;
LNode *pre = L;
while(p->next != NULL)
{
pre = p;
p = p->next;
if(p->data == e)
{
if(p->next == NULL)
{
pre = NULL;
free(p);
return L;
}
else
{
pre->next = p->next;
free(p);
return L;
}
}
}
}
void LinkListTraverse(LinkList L)
{
LNode *temp = L->next;
while(temp != NULL)
{
cout<<temp->data<<" ";
temp = temp->next;
}
cout<<endl;
}
int main()
{
LinkList L;
L = LinkListCreateT();
cout<<"1此时链表中元素有:"<<endl;
LinkListTraverse(L);
cout<<"*此时链表长度为:"<<LinkListLength(L)<<endl;
LinkListDelete(L,1);
cout<<"2删除元素1后链表中元素有:"<<endl;
LinkListTraverse(L);
cout<<"**此时链表长度为:"<<LinkListLength(L)<<endl;
LinkListInsert(L,3,11);
cout<<"3在位置1处增加元素4后链表中元素有:"<<endl;
LinkListTraverse(L);
cout<<"4如果在位置15处(越界)增加元素15后有:"<<endl;
LinkListInsert(L,15,15);
LinkListTraverse(L);
cout<<"***此时链表长度为:"<<LinkListLength(L)<<endl;
return 0;
}
测试截图
![单链表测试图](https://i-blog.csdnimg.cn/blog_migrate/36998715302836c8b32f276dcd3be048.png)