首页 / 算法 / 【算法设计-链表】单链表与双向循环链表
【算法设计-链表】单链表与双向循环链表
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了【算法设计-链表】单链表与双向循环链表,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2998字,纯文字阅读大概需要5分钟。
内容图文
1.单链表代码:包含了尾插法,插入,删除操作。
有头结点的单链表也是为了在第一个位置插入和删除时候容易,不需要另外讨论
#include<stdio.h>
#include<stdlib.h>
typedef struct Linklist
{
int key;
Linklist *next;
}Linklist;
Linklist* create_end()
{
Linklist *head=(Linklist *)malloc(sizeof(Linklist));
Linklist *e,*p;
e=head;
printf("输入值?以#结束\n");
int ch;
while((scanf("%d",&ch))==1)
{
p=(Linklist *)malloc(sizeof(Linklist));
p->key=ch;
e->next=p;
e=p;
}
e->next=NULL;
printf("done\n");
return head;//这里返回头结点而不是head->next,目的就是为了后面的插入和删除时候可以在第一个位置插入和删除
}
void add(Linklist* head)
{
Linklist *q=head;
Linklist *p=(Linklist*)malloc(sizeof(Linklist));
int ch;
printf("要插入的位置:");
fflush(stdin);
scanf("%d",&ch);
int i=1;//i要从1开始
while(i!=ch)
{
q=q->next;
i++;
}
p->next=q->next;
q->next=p;
printf("要插入的数据是多少:");
fflush(stdin);
scanf("%d",&ch);
p->key=ch;
}
void delete_s(Linklist* head)
{
printf("要删除第几个位置:");
int ch;
fflush(stdin);
scanf("%d",&ch);
Linklist *p=head;
Linklist *q=p->next;
int i=1;
while(i!=ch)
{
q=q->next;
p=p->next;
i++;
}
p->next=q->next;
printf("删除了%d",q->key);
delete q;
}
void show_Linklist(Linklist* head)
{
Linklist* p=head->next;//为了不输出头结点的值要从head->next开始
while(p->next!=NULL)
{
printf("%d->",p->key);
p=p->next;
}
printf("%d",p->key);
}
int main(void)
{
Linklist *head=new Linklist;
head=create_end();
add(head);
show_Linklist(head);
delete_s(head);
show_Linklist(head);
return 0;
}
结果展示:
2.双向循环链表:包含尾插,插入,删除
本文中循环链表包含头结点。这样做的好处是为了在第一个位置插入和删除都很容易
插入操作:
注意:要始终以头结点后面一个节点作为标杆指针计算
代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct Linklist
{
int key;
Linklist *prior;
Linklist *next;
}Linklist;
Linklist* create_end()
{
Linklist *head=(Linklist *)malloc(sizeof(Linklist));
head->key=0;
Linklist *e,*p;
e=head;
printf("输入值?以#结束\n");
int ch;
while((scanf("%d",&ch))==1)
{
p=(Linklist *)malloc(sizeof(Linklist));
p->key=ch;
e->next=p;
p->prior=e;
e=p;
}
e->next=head;
head->prior=e;
printf("done\n");
return head;
}
void add(Linklist* head)
{
Linklist *p=head->next;
Linklist *r=(Linklist*)malloc(sizeof(Linklist));
int ch;
printf("要插入的位置:");
fflush(stdin);
scanf("%d",&ch);
int i=1;
while(i!=ch)
{
p=p->next;
i++;
}
printf("要插入的数据是多少:");
scanf("%d",&ch);
r->key=ch;
r->next=p;//注意这里的写法
r->prior=p->prior;
r->prior->next=r;
p->prior=r;
}
void delete_s(Linklist* head)
{
Linklist *p=head->next;//这里要有next
if(p->next==head)
{
printf("不能删除了,已经空了!\n");
}
printf("要删除第几个位置:");
int ch;
fflush(stdin);
scanf("%d",&ch);
int i=1;
while(i!=ch)
{
p=p->next;
i++;
}
p->prior->next=p->next;
p->next->prior=p->prior;
printf("删除了%d\n",p->key);
delete p;
}
void show_Linklist(Linklist* head)
{
Linklist *p=head->next;
while(p->next!=head)
{
printf("%d->",p->key);
p=p->next;
}
printf("%d",p->key);
}
int main(void)
{
Linklist *head=new Linklist;
head=create_end();
add(head);
show_Linklist(head);
delete_s(head);
show_Linklist(head);
return 0;
}
原文:http://blog.csdn.net/wodeai1625/article/details/45534629
内容总结
以上是互联网集市为您收集整理的【算法设计-链表】单链表与双向循环链表全部内容,希望文章能够帮你解决【算法设计-链表】单链表与双向循环链表所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。