单向链表和双向链表区别(单向链表)

互联网   2023-05-25 17:19:14

导读 你们好,最近小活发现有诸多的对于单向链表和双向链表区别,单向链表这个问题都颇为感兴趣的,为大家梳理了下,一起往下看...

你们好,最近小活发现有诸多的对于单向链表和双向链表区别,单向链表这个问题都颇为感兴趣的,为大家梳理了下,一起往下看看吧。


(资料图片仅供参考)

1、首先,定义了链表的数据结构和链表的类。

2、在链表类中构造各种实现方法,如插入、删除、显示、获取头指针等。

3、如果要在链表中节点A之前插入节点B,需要考虑以下几种情况。在插入之前,链表是一个空表。此时,在插入新的节点B之后。如果A是链表的第一个节点,节点B是插入后的第一个节点。如果存在于链表中并且不是第一个节点,

4、那么就要先找到A的最后一个节点a_k,然后让a_k的指针字段指向B,再让B的指针字段指向A,这样就可以完成插入了。如果链表中不存在,则在末尾插入。先找到链表的最后一个节点a_n,然后让a_n的指针字段指向节点B,

5、并且b指针的指针为空。

6、如果要删除链表中的节点A,释放被删除节点占用的存储空间,需要考虑以下几种情况。如果要删除的节点A是第一个节点,将头指向A的下一个节点.要删除的节点A存在于链表中,但它不是第一个节点。

7、那么应该使a的前一个节点a_k-1的指针字段指向a的下一个节点a _ k-1。如果空表或要删除的节点A不存在,则不会进行任何更改。

8、代码:

9、//主函数

10、int main(){StudyList A,B;

11、double Data[10]={12,2,3,44,23,4,23,42,342,8};

12、A.insertList(0,Data[0]);

13、for(int i=1;i10;i++)

14、A.insertList(0,Data[i]);

15、//11

16、A.outputList();

17、A.deleteList(Data[7]);

18、A.outputList();

19、B.insertList(0,Data[0]);

20、for(int i=0;i10;i++)

21、B.insertList(B.getHead()-Data,Data[i]);

22、B.outputList();

23、B.deleteList(55);

24、B.outputList();

25、return 0;

26、}

27、//类库、、、

28、#ifndef STUDYOPERATION_H_

29、#define STUDYOPERATION_H_

30、//学习链表,动态内存分配20150611

31、struct Node

32、{

33、//定义链表的结构

34、double Data;

35、Node *next;

36、};

37、class StudyList

38、{

39、Node *head;

40、public:

41、StudyList();

42、~StudyList();

43、/*double isEmpty();*/

44、void addToHead(double);

45、void addToTail(double);

46、double deleteFromHead();

47、double deleteFromTail();

48、void output list();//链表节点的输出

49、Node *getHead();

50、void insertList(double aData,double bData);

51、void deleteList(double aData);

52、private:

53、};

54、#endif

55、//实现,,,

56、#include "studyOperation.h"

57、#include "main.h"

58、StudyList:StudyList()

59、{

60、head=NULL;

61、}

62、StudyList:~StudyList()

63、{

64、}

65、void StudyList:addToHead(double el)

66、{

67、}

68、Node *StudyList:getHead()

69、{

70、return head;

71、}

72、void StudyList:outputList()

73、{

74、//链表的输出函数

75、Node *current=head;

76、while(current!=NULL)

77、{

78、coutcurrent-Data" ";

79、current=current-next;

80、}

81、coutendl;

82、}

83、Void study list: insert list (double adata, double bData)//Let Adatte be the data in node A and date B be the data in node B.

84、{

85、Node *ptr_a,*ptr_ak,*ptr_b;

86、ptr _ b=(Node *)new(Node);//动态分配一个新节点。

87、ptr_b-Data=bData;

88、ptr_a=head;

89、if(head==NULL)

90、{

91、//如果是空链表,将B作为第一个节点。

92、 cout"空链表!"endl;

93、 head=ptr_b;

94、 ptr_b-next=NULL;

95、}

96、else if(ptr_a-Data==aData)

97、 {

98、 //若a为第一个结点,b插在a之前

99、 ptr_b-next=ptr_a;

100、 head=ptr_b;

101、 }else

102、{

103、while(ptr_a-Data!=aDataptr_a-next!=NULL)

104、{

105、//a存在,但不在第一个结点

106、ptr_ak=ptr_a;

107、ptr_a=ptr_a-next;

108、}

109、if(ptr_a-Data==aData)

110、{

111、//若存在a,将b插在a的前面

112、ptr_ak-next=ptr_b;

113、ptr_b-next=ptr_a;

114、}

115、else

116、{

117、//若没有结点a

118、ptr_a-next=ptr_b;

119、ptr_b-next=NULL;

120、}

121、 }

122、}

123、void StudyList:deleteList(double aData)

124、{

125、Node *ptr_a,*ptr_b;

126、ptr_a=head;

127、if(ptr_a==NULL)//若空

128、return;

129、if(ptr_a-Data==aData)//若是第一个结点

130、{

131、head=ptr_a-next;

132、delete ptr_a;

133、}else

134、{

135、while(ptr_a-Data!=aDataptr_a-next!=NULL)//查找结点a

136、{

137、ptr_b=ptr_a;

138、ptr_a=ptr_a-next;

139、}

140、if(ptr_a-Data==aData)//若有a

141、{

142、ptr_b-next=ptr_a-next;

143、delete ptr_a;

144、}

145、}

146、}

147、效果

以上就是单向链表这篇文章的一些介绍,希望对大家有所帮助。

相关资讯
最新资讯