初探双向链表

  还是先来唠唠最近发生的事把。

ok,拿到奖学金,被选为优秀团员,我一点感觉都没有。最近让我比较激动的是我参加了学校的盛特杯,这件事本来我是不想参与的,我觉得我还太弱,没有能力去做一个项目。但是导师给我电邮让我参加,我想干脆就抱个大腿吧,让大腿教教我怎么做项目,于是就找了个大二的学长。额,目前这件事还没有任何进展,可能是大腿要考研比较忙吧。由于刘同到高中母校演讲,最近又有电影上映,于是我就去买了《谁的青春不迷茫》来看。我靠,真的是一本烂的不能再烂的书啊,以后这种书坚决不自己买了,还是去图书馆看。

今早上去图书馆对数据结构进行攻关,把双向链表的代码写出来了,双向链表就是在单向链表的基础上再加一个前驱,其他的大致都与单向链表差不多,主要包含初始化,插入删除查找的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;
typedef struct DulNode
{
Elemtype data;
struct DulNode *prior;
struct DulNode *next;
}DulNode,*Dulinklist;
void InitDulNode(DulNode *head)// 创建一个双向链表的表头,前驱和后继都指向自己
{
head->prior=head;
head->next=NULL;
}

DulNode *GetElemp_dul(DulNode *head,int i)
{
int j=1;
DulNode *p=head->next;
while(p!=NULL&&j<i)
{
p=p->next;
j++;
}
if(j==i)
{
return p;
}
else
return 0;
}

int Listinsert_Dul(DulNode *head,int pos,int e)//pos为要插入的位置,e为插入节点的值
{
DulNode *p;
p=GetElemp_dul(head,pos);
if(!p)
{
printf("pos error!\n");
return 0;
}
DulNode *s;
if(!(s=(Dulinklist)malloc(sizeof(DulNode))))
return 0;
s->data=e;
s->prior=p->prior;
p->prior->next=s;
s->next=p;
p->prior=s;
return 1;
}
void Print(DulNode *head)
{
DulNode *p;
p=head->next;
while(p!=NULL)
{
printf("%d\t",p->data);
p=p->next;
}
}
void CreatDulNode(DulNode *head,int e)
{
DulNode *p;
p=(DulNode *)malloc(sizeof(DulNode));
p->data=e;
p->next=NULL;
if(head->next==NULL)
{
p->prior=head;
head->next=p;
}
else
{
head->next->prior=p;
p->next=head->next;
p->prior=head;
head->next=p;
}
}
int Listdelete_Dul(DulNode *head,int i)
{
DulNode *p;
p=GetElemp_dul(head,i);
if(!p)
{
printf("delete pos error!\n");
return 0;
}
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
return 1;
}
int main()
{
DulNode *head;
head=(DulNode *)malloc(sizeof(DulNode));
int i;
InitDulNode(head);
for(i=0;i<10;i++)
{
CreatDulNode(head,i);
}
Listinsert_Dul(head,4,100);
Listdelete_Dul(head,4);
Print(head);
return 0;
}
这代码还是花了我1个多小时才写出来的,哎,太花时间了。