【 数据结构(C语言)】线性表——单链表和单循环链表
1.线性链表:用任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的也可以是不连续)
2.动态链表和静态链表的区别
- 静态链表是用数组实现的,是顺序的存储结构,在物理地址上是连续的,而且需要预先分配大小。
- 动态链表是用申请内存函数(C是malloc,C++是new)动态申请内存的,所以在链表的长度上没有限制。动态链表因为是动态申请内存的,所以每个节点的物理地址不连续,要通过指针来顺序访问。
3.单链表基本功能实现
#include <bits/stdc++.h>
using namespace std;
#define ElemType int
#define Status int
#define ERROR -1
#define OK 1
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode ,*LinkList;
LinkList CreateListHead_L(int n)///* 头插入
{
LinkList L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
while (n--)
{
LinkList newnode = (LinkList)malloc(sizeof(LNode));
scanf("%d",&newnode->data);
newnode->next = L->next;
L->next = newnode;
}
return L;
}
LinkList CreateListTail_L(int n)///尾插入
{
LinkList L = (LinkList)malloc(sizeof(LNode));
LinkList last = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
last = L;
while (n--)
{
ElemType e;
scanf("%d",&e);
LinkList newnode = (LinkList)malloc(sizeof(LNode));
newnode->data = e;
last->next = newnode;
newnode->next = NULL;
last = newnode;
}
return L;
}
Status GetElem_L(LinkList &L,int i,ElemType &e)
{
LinkList index = L->next;
int ct = 1;
while (index && ct < i)
{
index = index->next;
++ct;
}
if (!index || ct > i) return ERROR;
e = index->data;
return OK;
}
Status ListInsert_L(LinkList &L,int i,ElemType e)
{
LinkList index = L->next;
int ct = 1;
while (index && ct < (i-1))
{
index = index->next;
++ct;
}
if (!index || ct > i -1) return ERROR;
LinkList newnode = (LinkList)malloc(sizeof(LNode));
newnode->data = e;
newnode->next = index->next;
index->next = newnode;
return OK;
}
Status ListDeteleByPos_L(LinkList &L,int i,ElemType &e)
{
LinkList index = L->next;
int ct = 1;
while (index && ct < i-1)
{
index = index->next;
++ct;
}
if (!(index->next) || ct > i-1) return ERROR;
LinkList tmp = index->next;
index->next = tmp->next;
e = tmp->data;
free(tmp);
return OK;
}
Status ListDeteleByVal_L(LinkList &L,ElemType e)
{
LinkList index = L->next,pri = L;
while (index) /// 注意:判断的如果是 pri pri 是最后一个元素的时候 index 已经超出链表
{
if (index->data == e)
{
pri->next = index->next;
free(index);
index = pri->next;
}
else
{
pri = pri->next;
index = index->next;
}
}
return OK;
}
int GetLength(LinkList &L)
{
int len = 0;
LinkList index = L->next;
while (index)
{
index = index->next;
len++;
}
return len;
}
LinkList ListReverse(LinkList &L)
{
LinkList a = L->next;
LinkList b = a->next;
LinkList c = b->next;
a->next = NULL;
int len = GetLength(L);
while (len--)
{
b->next = a;
c = b;
b = a;
if(!a)
{
L->next=a;
}
else c=c->next;
}
return L;
}
void TrverseLinklist(LinkList &L)///* 注意:这里是带头指针的链表
{
LinkList index = L->next;
for (;index!= NULL; index = index->next)
{
cout<<index->data<<" ";
}
cout<<endl;
}
4.单循环链表
注意:只是将单链表中的最后一个结点的指针是指着头结点的,形成循环
#include <bits/stdc++.h>
using namespace std;
#define ElemType int
#define Status int
#define ERROR -1
#define OK 1
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode ,*LinkList;
LinkList CreateListHead_L(int n)///* 头插入
{
LinkList L = (LinkList)malloc(sizeof(LNode));
L->next = L;/// 改:
while (n--)
{
LinkList newnode = (LinkList)malloc(sizeof(LNode));
scanf("%d",&newnode->data);
newnode->next = L->next;
L->next = newnode;
}
return L;
}
LinkList CreateListTail_L(int n)///尾插入
{
LinkList L = (LinkList)malloc(sizeof(LNode));
LinkList last = (LinkList)malloc(sizeof(LNode));
L->next = L;
last = L;
while (n--)
{
ElemType e;
scanf("%d",&e);
LinkList newnode = (LinkList)malloc(sizeof(LNode));
newnode->data = e;
last->next = newnode;
newnode->next = L;/// 改:
last = newnode;
}
return L;
}
Status GetElem_L(LinkList &L,int i,ElemType &e)
{
LinkList index = L->next;
int ct = 1;
while (index && ct < i)
{
index = index->next;
++ct;
}
if (!index || ct > i) return ERROR;
e = index->data;
return OK;
}
Status ListInsert_L(LinkList &L,int i,ElemType e)
{
LinkList index = L->next;
int ct = 1;
while (index && ct < (i-1))
{
index = index->next;
++ct;
}
if (!index || ct > i -1) return ERROR;
LinkList newnode = (LinkList)malloc(sizeof(LNode));
newnode->data = e;
newnode->next = index->next;
index->next = newnode;
return OK;
}
Status ListDeteleByPos_L(LinkList &L,int i,ElemType &e)
{
LinkList index = L->next;
int ct = 1;
while (index && ct < i-1)
{
index = index->next;
++ct;
}
if (!(index->next) || ct > i-1) return ERROR;
LinkList tmp = index->next;
index->next = tmp->next;
e = tmp->data;
free(tmp);
return OK;
}
Status ListDeteleByVal_L(LinkList &L,ElemType e)
{
LinkList index = L->next,pri = L;
while (index != L) /// 改:将循环条件改了
{
if (index->data == e)
{
pri->next = index->next;
free(index);
index = pri->next;
}
else
{
pri = pri->next;
index = index->next;
}
}
return OK;
}
int GetLength(LinkList &L)
{
int len = 0;
LinkList index = L->next;
while (index != L)/// 改:将循环条件改了
{
index = index->next;
len++;
}
return len;
}
void TrverseLinklist(LinkList &L)///* 注意:这里是带头指针的链表
{
LinkList index = L->next;
for (;index!= L; index = index->next)/// 改:将循环条件改了
{
cout<<index->data<<" ";
}
cout<<endl;
}

浙公网安备 33010602011771号