你们好,最近小活发现有诸多的小伙伴们对于单向链表和双向链表区别,单向链表这个问题都颇为感兴趣的,今天小活为大家梳理了下,一起往下看看吧。
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、 效果
以上就是单向链表这篇文章的一些介绍,希望对大家有所帮助。
标签:
免责声明:本文由用户上传,如有侵权请联系删除!