SingleLinkList.h
1: # ifndef SINGLELINKLIST_H
2: # define SINGLELINKLIST_H
3:
4: /***********************************************************************/
5: /* 存储结构的定义 */
6: /************************************************************************/
7: typedef struct ds_link_node {
8: int data ;
9: struct ds_link_node * next ;
10: }ds_link_head;
11:
12: /************************************************************************/
13: /* 基本操作定义 */
14: /************************************************************************/
15:
16: /*初始化头结点*/
17: void ds_initHead(ds_link_head * pHead) ;
18:
19: /*插入元素,倒插法,新插入的元素为表的第一个元素*/
20: void ds_insertFirst(ds_link_head * pHead,int elem) ;
21:
22: /*插入元素,插入元素到表尾*/
23: void ds_insertLast(ds_link_head *pHead,int elem) ;
24:
25: /*在特定结点的前的插入新的结点*/
26: int ds_insertBefore(ds_link_head * pHead,int i,int elem) ;
27:
28: /*在特定结点的后的插入新的结点*/
29: /*成功,返回表的长度;否则,返回0 */
30: int ds_insertAfter(ds_link_head * pHead ,int i,int elem);
31:
32: /*返回特定的数据在表中位置*/
33: int ds_getLocation(ds_link_head *pHead,int elem) ;
34:
35: /*获取特定位置的元素*/
36: int ds_getElem(ds_link_head *pHead,int location) ;
37:
38: /*遍历*/
39: void ds_traverseList(ds_link_head * pHead) ;
40:
41: # endif
SingleLinkList.c
1: # include <stdio.h>
2: # include <stdlib.h>
3: # include "SingleLinkList.h"
4:
5: /*初始化头结点*/
6: void ds_initHead(ds_link_head * pHead) {
7: pHead->data = 0 ; /*头结点的数据域存放链表的长度*/
8: pHead->next = NULL ;
9: }
10:
11: /*生成一个新的结点*/
12: struct ds_link_node * ds_createNode(int elem) {
13: struct ds_link_node * temp ;
14: temp = (struct ds_link_node *)malloc(sizeof(struct ds_link_node)) ;
15: if(!temp)
16: exit(0) ;
17: temp->data = elem ;
18: temp->next = NULL ;
19: return temp ;
20: }
21:
22: /*插入元素,倒插法,新插入的元素为表的第一个元素*/
23: void ds_insertFirst(ds_link_head * pHead,int elem) {
24: struct ds_link_node * temp ;
25: struct ds_link_node * node ;
26: node = ds_createNode(elem) ;/*生成一个新的结点*/
27: /*将新生成的结点插入到头结点后*/
28: temp = pHead->next ;
29: pHead->next = node ;
30: node->next = temp ;
31:
32: pHead->data ++ ; //头结点的数据域保存表中元素的个数
33: }
34:
35: /*插入元素,插入元素到表尾*/
36: void ds_insertLast(ds_link_head *pHead,int elem) {
37: struct ds_link_node * temp ;
38: struct ds_link_node * node ;
39: node = ds_createNode(elem) ;/*生成一个新的结点*/
40:
41: temp = pHead ;
42: for( ; temp->next ; temp = temp->next) ;/*找到表尾*/
43: temp->next = node ;
44:
45: pHead->data ++ ;
46: }
47: /*在特定结点的前面的插入新的结点*/
48: /*成功,返回表的长度;否则,返回0 */
49: int ds_insertBefore(ds_link_head * pHead,int i,int elem){
50: struct ds_link_node * target; /*目标结点*/
51: struct ds_link_node * node ; /*新结点*/
52: struct ds_link_node * tmp ;
53: int j = 0 ;
54:
55: if(i > pHead->data || i < 1)
56: return 0 ;
57:
58: node = ds_createNode(elem) ; /*生成新的结点*/
59: /*寻找到目标结点 */
60: target = pHead ;
61: for( ; j < (i-1) ; j ++ ,target = target->next) ;
62: /*插入新生成的结点*/
63: tmp = target->next ;
64: target->next = node ;
65: node ->next = tmp ;
66:
67: return ++pHead->data ;
68: }
69:
70: /*在特定结点的后插入新的结点*/
71: /*成功,返回表的长度;否则,返回0 */
72: int ds_insertAfter(ds_link_head * pHead ,int i,int elem) {
73: struct ds_link_node * target; /*目标结点*/
74: struct ds_link_node * node ; /*新结点*/
75: struct ds_link_node * tmp ;
76: int j = 0 ;
77:
78: if(i > pHead->data || i < 1)
79: return 0 ;
80:
81: node = ds_createNode(elem) ; /*生成新的结点*/
82: /*寻找到目标结点 */
83: target = pHead ;
84: for( ; j < i ; j ++ ,target = target->next) ;
85: /*插入新生成的结点*/
86: tmp = target->next ;
87: target->next = node ;
88: node ->next = tmp ;
89:
90: return ++pHead->data ;
91: }
92: /*返回数据在表中位置*/
93: int ds_getLocation(ds_link_head * pHead,int elem) {
94: struct ds_link_node * temp ;
95: int location ;
96:
97: temp = pHead ->next;
98: location = 0 ;
99: while(temp) {
100: ++ location ;
101: if(temp->data == elem)
102: break ;
103: temp = temp->next ;
104: }
105: return location ;
106: }
107:
108: /*获取特定位置的元素*/
109: int ds_getElem(ds_link_head *pHead,int location) {
110: struct ds_link_node * temp ;
111: int i = 1;
112: temp = pHead->next ; /*从头结点的下一个结点开始搜索*/
113: for( ; i < location ; i ++ , temp = temp->next) ;
114: return temp->data ;
115: }
116:
117: /*遍历*/
118: void ds_traverseList(ds_link_head * pHead) {
119: struct ds_link_node * temp ;
120: temp = pHead->next ;
121: while(temp) {
122: printf("%4d ",temp->data) ;
123: temp = temp->next ;
124: }
125: }
测试程序
1: # include <stdio.h>
2: # include "SingleLinkList.h"
3:
4: int main()
5: {
6: ds_link_head head ;
7: int i ;
8: ds_initHead(&head) ;
9: ds_insertFirst(&head,10) ; /*倒插法添加数据*/
10: ds_insertLast(&head,4) ; /*添加数据到表尾*/
11: ds_insertFirst(&head,20) ;
12: ds_insertFirst(&head,30) ;
13: ds_insertFirst(&head,40) ;
14: ds_traverseList(&head) ;
15: printf("\n") ;
16: ds_insertBefore(&head,3,3) ;/*在位置3前插入元素*/
17: i = ds_getLocation(&head,3) ;/*获取数据3在表中的位置 */
18: printf("%d\n",i) ;
19: printf("%d\n",ds_getElem(&head,3)) ;/*获取位置3的元素*/
20: ds_traverseList(&head) ;/*遍历*/
21: ds_insertAfter(&head,4,5) ;/*在位置4后插入元素5*/
22: printf("\n") ;
23: ds_traverseList(&head) ;
24: getchar();
25: return 0 ;
26: }
27: