目录:
内存特点
单向链表的内存具有随机性,不连续性,动态性这三个特点,具体来说:
随机性:单向链表首地址即头结点地址随机生成。
不连续性:存储单元之间不连续。
动态性:存储空间动态生成。
类型定义
单向链表的每个结点用结构体定义,包括两部分:数据和指针。数据用来存储该结点的数据,指针next指向下一个结点使链表的所有结点顺序相连。
typedef struct Node
{
int date; //数据
struct Node *next; //地址
}Node,*linklist;
操作实现
- 初始化
申请头节点,将头结点的next指针指向NULL。
void list_init(linklist &L)
{
L=(linklist)malloc(sizeof(Node)); //申请空间
if(!L) return;
L->next=NULL; //头节点指空
}
- 判空
判断头节点L是否指空,指空则为空,否则不空。
int list_empty(linklist &L)
{
if(L->next==NULL) return 1;
else return 0;
}
- 求长
遍历链表,直至NULL,记录步数。
int list_length(linklist L)
{ int sum=0;
linklist p=L;
while(p) //指空则跳出
{
sum++;
p=p->next;
}
return sum;
}
- 查找
查找表中e所在的位置,不存在e则返回-1。
遍历链表,同时j自加计数,当表空或搜到e则跳出,表空返回-1,否则返回j。
int list_seek(linklist L,int e)
{
int j=1;
linklist p=L;
while(p)
{
j++;
p=p->next;
if(p->date==e) break;
}
if(!p) return -1;
else return j;
}
- 插入
在第i个元素之前插入e。
为e申请一个结点,之后将链表遍历到第i个结点,插入e。
void list_insert(linklist &L,int i,int e)
{
linklist p=L;
linklist l=(linklist)malloc(sizeof(Node));
l->date=e;
for(int j=1;j<i-1;j++)
p=p->next;
l->next=(p->next);
p->next
}
- 删除
删除第i个元素。
修改i-1结点的指针使其指向i+1个结点,释放第i个结点。
void list_insert(linklist &L,int i,int e)
{
linklist p=L;
linklist l=(linklist)malloc(sizeof(Node));
l->date=e;
for(int j=1;j<i-1;j++)
p=p->next;
l->next=(p->next);
p->next
}
- 尾插建表
顺序向后插入n个元素。
void tail_creat(linklist &L,int n)
{
linklist pre=L;
for(int i=0;i<n;i++)
{
linklist p=(linklist)malloc(sizeof(Node));
cin>>p->date;
pre->next=p;
pre=p;
}
pre->next=NULL;
}
- 头插建表
逆序向后插入n个元素。
void head_creat(linklist &L,int n)
{
for(int i=0;i<n;i++)
{
linklist p=(linklist)malloc(sizeof(Node));
cin>>p->date;
p->next=L->next;
L->next=p;
}
}
实例测试
头插三个元素,尾插三个元素;
判空求长;
取第二个元素;
在第二个元素前插入9;
删除第三个元素;
查找2的位序;
遍历输出;
int main()
{
linklist L;
list_init(L);
tail_creat(L,3);
head_creat(L,3);
cout<<list_empty(L);cout<<"\n";
cout<<list_length(L);cout<<"\n";
cout<<list_get(L,2);cout<<"\n";
list_insert(L,2,9);
list_delete(L,3);
cout<<list_seek(L,2);cout<<"\n";
linklist q=L->next;
while(q)
{
cout<<q->date<<" ";
q=q->next;
}
}