1、链表定义
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
typedef struct Node { int data; struct Node *next; //next指针指向自己这种数据类型,这就形成了链表 }SList;
单向链表的结构图
2、创建、添加 遍历 删除 反转元素操作功能实现
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef struct Node { 5 int data; 6 struct Node *next; 7 }SList; 8 9 int SList_Create(SList **p/**out*/) { 10 int data = 0; 11 int ret = 0; 12 SList *pHead = NULL; 13 SList *node = NULL; 14 SList *tmp = NULL; 15 pHead = (SList *)malloc(sizeof(SList)); 16 if(pHead == NULL) { 17 ret = -1; 18 printf("SList_Create erro "); 19 goto End; 20 } 21 tmp = pHead; 22 printf("请输入一个整数数据 "); 23 scanf("%d", &data); 24 while(data != -1) { 25 node = (SList *)malloc(sizeof(SList)); 26 if(node == NULL) { 27 ret = -1; 28 printf("SList_Create erro "); 29 goto End; 30 } 31 node->data = data; 32 tmp->next = node; 33 tmp = node; 34 printf("请输入一个整数数据 "); 35 scanf("%d", &data); 36 } 37 node->next = NULL; 38 *p = pHead; 39 End: 40 if(ret != 0) { 41 if(pHead != NULL) { 42 free(pHead); 43 pHead = NULL; 44 } 45 if(node != NULL) { 46 free(node); 47 node = NULL; 48 } 49 } 50 return ret; 51 } 52 53 void print_List(SList *pHead) { 54 SList *pTmp; 55 if(pHead == NULL || pHead->next == NULL) { 56 printf("SList is NULL "); 57 } 58 pTmp = pHead; 59 while(pTmp->next) { 60 printf("%d ", pTmp->next->data); 61 pTmp = pTmp->next; 62 } 63 } 64 65 int insert_List(SList *pHead/**in*/, int targetNum, int insertNum) { 66 int ret = 0; 67 SList *pPre = NULL; 68 SList *pCur = NULL; 69 SList *pNode = NULL; 70 if(pHead == NULL || pHead->next == NULL) { 71 ret = -1; 72 printf("insert_List erro "); 73 return ret; 74 } 75 pCur = pHead->next; 76 pPre = pHead; 77 pNode = (SList *)malloc(sizeof(SList)); 78 if(pNode == NULL) { 79 ret = -1; 80 printf("insert_List erro "); 81 return ret; 82 } 83 pNode->data = insertNum; 84 while(pCur) { 85 if(pCur->data == targetNum) { 86 break; 87 }else { 88 pPre = pCur; 89 pCur = pCur->next; 90 } 91 } 92 pNode->next = pCur; 93 pPre->next = pNode; 94 return ret; 95 } 96 97 int delete_List(SList *pHead, int deleteNum) { 98 int ret = 0; 99 SList *pPre = NULL; 100 SList *pCur = NULL; 101 if(pHead == NULL || pHead->next == NULL) { 102 ret = -1; 103 printf("delete_List erro "); 104 return ret; 105 } 106 pPre = pHead; 107 pCur = pHead->next; 108 while(pCur) { 109 if(pCur->data == deleteNum) { 110 break; 111 }else { 112 pPre = pCur; 113 pCur = pCur->next; 114 } 115 } 116 if(pCur == NULL) { 117 ret = -2; 118 printf("not exist this num"); 119 return ret; 120 } 121 pPre->next = pCur->next; 122 pCur->next = NULL; 123 if(pCur != NULL) { 124 free(pCur); 125 } 126 return ret; 127 } 128 129 void destory_List(SList **p) { 130 SList *pHead = NULL; 131 SList *tmp = NULL; 132 if(p == NULL || *p == NULL) { 133 return; 134 } 135 pHead = *p; 136 while(pHead) { 137 tmp = pHead->next; 138 if(pHead != NULL) { 139 free(pHead); 140 } 141 pHead = tmp; 142 } 143 *p = NULL; 144 } 145 146 void reverse_List(SList *pHead) { 147 SList *pPre = NULL; 148 SList *pCur = NULL; 149 SList *pTmp = NULL; 150 if(pHead == NULL || pHead->next == NULL || pHead->next->next == NULL) { 151 return; 152 } 153 pPre = pHead->next; 154 pCur = pHead->next->next; 155 while(pCur) { 156 pTmp = pCur->next; 157 pCur->next = pPre; 158 pPre = pCur; 159 pCur = pTmp; 160 } 161 pHead->next->next = NULL; 162 pHead->next = pPre; 163 } 164 165 int main() { 166 int ret = 0; 167 SList *node1 = NULL; 168 ret = SList_Create(&node1); 169 if(ret) { 170 printf("create list erro "); 171 } 172 print_List(node1); 173 printf(" insert_List "); 174 insert_List(node1, 20, 19); 175 print_List(node1); 176 printf(" delete_List "); 177 delete_List(node1, 19); 178 print_List(node1); 179 printf(" reverse_List "); 180 reverse_List(node1); 181 print_List(node1); 182 printf(" destory_List "); 183 destory_List(&node1); 184 system("pause"); 185 return 0; 186 }