day1-双向链表
程序员文章站
2022-03-24 18:21:10
...
前言-学习数据结构与算法第一天
今天是2020年7月13日,今天开始学习数据结构与算法这门课程,之前好多立下的学习计划貌似都荒废了,这次可千万不能荒废啊,拜托了!
今天先学习一个简单的,双向链表,有单链表的基础,这双向链表也是学的比较快,基本原理搞懂了,代码跟单链表一样一样的。
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next,*pre;
}NODE;
void CreateList(NODE *head)
{
NODE *p,*q;
//p=(NODE *)malloc(sizeof(NODE));
//步骤1,构造一个只有头节点的双向循环链表
head->next=head;
head->pre=head;
p=head;
while(1)
{
//新节点分配空间以及数据域的赋值
q=(NODE *)malloc(sizeof(NODE));
scanf("%d",&q->data);
//当数据为0时,不再新建节点
if(q->data==0)break;
//双向连接
q->next=head;
q->pre=p;
p->next=q;
head->pre=q;
//节点后移
p=q;
}
}
void print(NODE *h)
{
NODE *p=h->next;
while(p!=h)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
//在第i个元素之前插入元素
void insert(NODE *h,int n)
{
int i=0;
NODE *p=h->next,*q;
q=(NODE *)malloc(sizeof(NODE));
printf("请输入需要插入的元素:");
scanf("%d",&q->data);
while(p!=h)
{
i++;
if(i==n)break;
p=p->next;
}
//插入的顺序尤其需要注意
//先处理新节点的指针域
//被插入的两个指针域顺序不能乱
q->next=p;
q->pre=p->pre;
p->pre->next=q;
p->pre=q;
}
//删除第n个元素
void del(NODE *h)
{
NODE *p=h->next;
int i=0,n;
printf("请输入想要删除第几个元素:");
scanf("%d",&n);
while(p!=h)
{
i++;
if(i==n)break;
p=p->next;
}
//看起来有点奇妙的代码,顺序乱了也没事
p->pre->next=p->next;
p->next->pre=p->pre;
}
//升序排列,单双链表差不多
void sortlist(NODE *h)
{
NODE *p,*q;
for(p=h->next;p!=h->pre;p=p->next)
{
for(q=p->next;q!=h;q=q->next)
{
if(p->data>q->data)
{
int t=p->data;
p->data=q->data;
q->data=t;
}
}
}
}
int main()
{
NODE *h;
h=(NODE *)malloc(sizeof(NODE));
CreateList(h);
print(h);
sortlist(h);
print(h);
return 0;
}