标签:
1 ////////////////////////////////////////////// 2 //单链表的初始化,建立,插入,查找,删除。 // 3 //(以及部分练习) // 4 //Author:Bread // 5 //Date: 2014.12.28 // 6 //Update 1th:2014.12.31 // 7 ////////////////////////////////////////////// 8 #include <stdio.h> 9 #include <stdlib.h> 10 typedef int ElemType; 11 //////////////////////////////////////////// 12 // 定义结点类型 // 13 //////////////////////////////////////////// 14 typedef struct Node { 15 ElemType data; //单链表中的数据域 16 short type; //结点类型:0表示结点,1表示头节点。 17 struct Node *next; //单链表的指针域 18 }Node, *LinkedList; 19 /*相当于 typedef Node* LinkedList,即LinkedList是Node的指针类型。*/ 20 21 LinkedList newnode(); //新建节点并初始化 22 LinkedList newhead(); //新建头节点并初始化 23 LinkedList LinkedListCreatH(); //头插法建立单链表 24 LinkedList LinkedListCreatT(); //尾插法建立单链表 25 LinkedList LinkedListInsert(LinkedList, int, ElemType); //在指定位置插入data = x的结点 26 LinkedList LinkedListDelete(LinkedList, int); //在指定位置删除节点 27 LinkedList LinkedListDeletex(LinkedList, ElemType); //删除所有data = x的结点 28 LinkedList printList(LinkedList); //输出单链表 29 LinkedList printtsiL(LinkedList); //逆序输出单链表 30 LinkedList LinkedListfree(LinkedList); //释放单链表 31 32 int main() { 33 LinkedList list, start; 34 int i; 35 ElemType x; 36 37 printf("Input data of list:\n"); 38 list = LinkedListCreatT(); 39 40 printList(list); 41 printtsiL(list); 42 43 printf("Enter the position of new node:\n"); 44 scanf("%d", &i); 45 printf("Enter the data of new node:\n"); 46 scanf("%d", &x); 47 LinkedListInsert(list, i, x); 48 49 printList(list); 50 printtsiL(list); 51 52 printf("Enter the data of node to delete:\n"); 53 scanf("%d", &x); 54 LinkedListDeletex(list, x); 55 printList(list); 56 printtsiL(list); 57 58 printf("Enter the position of node to delete:\n"); 59 scanf("%d", &i); 60 LinkedListDelete(list, i); 61 62 printList(list); 63 printtsiL(list); 64 65 LinkedListfree(list); 66 return 0; 67 } 68 69 //////////////////////////////////////////// 70 // 单链表结点的新建和初始化 // 71 //////////////////////////////////////////// 72 LinkedList newnode() { 73 Node *p; 74 p = (Node *)malloc(sizeof(Node)); //申请结点空间 75 if(p == NULL) { //判断是否有足够的内存空间 76 printf("Error: Not enough memory\n"); 77 } 78 p->data = 0; //初始化data 79 p->next = NULL; //初始化next 80 p->type = 0; 81 return p; 82 } 83 LinkedList newhead() { 84 Node *p; 85 p = (Node *)malloc(sizeof(Node)); //申请结点空间 86 if(p == NULL) { //判断是否有足够的内存空间 87 printf("Error: Not enough memory\n"); 88 } 89 p->data = 0; //初始化data 90 p->next = NULL; //初始化next 91 p->type = 1; 92 return p; 93 94 } 95 //////////////////////////////////////////// 96 // 单链表的建立1,头插法建立单链表 // 97 //////////////////////////////////////////// 98 LinkedList LinkedListCreatH() { 99 Node *L, *p; 100 L = newhead(); //申请头结点空间 101 ElemType x; //x为链表中的数据 102 while(scanf("%d", &x) != EOF) { //#define EOF (-1) 在DOS下 键入Ctrl+Z(^Z) 在Linux下 键入Ctrl+D 103 p = newnode(); //申请新的结点 104 p->data = x; //结点数据域赋值 105 p->next = L->next; //将结点插入到表头L-->|2|-->|1|-->NULL 106 L->next = p; 107 } 108 109 return L; 110 } 111 //////////////////////////////////////////// 112 // 单链表的建立2,尾插法建立单链表 // 113 //////////////////////////////////////////// 114 LinkedList LinkedListCreatT() { 115 Node *L, *p, *r; 116 L = newhead(); //申请头结点空间 117 r = L; //r始终指向终端结点,开始时指向头结点 118 ElemType x; //x为链表中的数据 119 while(scanf("%d", &x) != EOF) { 120 p = newnode(); //申请新的结点 121 p->data = x; //结点数据域赋值 122 r->next = p; //将结点插入到表头L-->|1|-->|2|-->NULL 123 r = p; 124 } 125 r->next = NULL; 126 127 return L; 128 } 129 //////////////////////////////////////////// 130 //单链表的插入,在链表的第i个位置插入x的元素 // /*含练习*/ 131 //////////////////////////////////////////// 132 LinkedList LinkedListInsert(LinkedList L, int i, ElemType x) { 133 Node *pre = L, *p; //pre为前驱结点 134 int tempi = 0; 135 for(tempi = 1; tempi < i && pre->next != NULL; tempi++) { 136 pre = pre->next; //查找第i个位置的前驱结点 137 } 138 /*练习:越界错误信息*/ 139 //插入的结点为p 140 p = newnode(); 141 p->data = x; 142 p->next = pre->next; 143 pre->next = p; 144 145 return L; 146 } 147 //////////////////////////////////////////// 148 // 单链表的删除1,在链表中删除所有值为x的元素 // 149 // 单链表的删除2,在链表中删除第i个元素 // /*含练习*/ 150 //////////////////////////////////////////// 151 LinkedList LinkedListDeletex(LinkedList L, ElemType x) { 152 Node *p = L, *pre = NULL; //pre为前驱结点,p为查找的结点。 153 while(p != NULL) { //查找值为x的元素 154 if(p->data == x && pre == NULL) { 155 L = p->next; //删除操作,将其前驱next指向其后继。 156 free(p); 157 p = L; 158 continue; 159 } 160 else if(p->data == x) { 161 pre->next = p->next; //删除操作,将其前驱next指向其后继。 162 free(p); 163 p = pre; 164 } 165 pre = p; 166 p = p->next; 167 } 168 169 return L; 170 } 171 LinkedList LinkedListDelete(LinkedList L, int i) { 172 Node *pre = L, *p; //pre为前驱结点 173 int tempi = 0; 174 for(tempi = 1; tempi < i && pre->next != NULL; tempi++) { 175 pre = pre->next; //查找第i个位置的前驱结点 176 } 177 /*练习:越界错误信息*/ 178 p = pre->next; 179 pre->next = p->next; 180 free(p); 181 return L; 182 } 183 //////////////////////////////////////////// 184 // 单链表的顺逆序输出 // /*含练习*/ 185 //////////////////////////////////////////// 186 LinkedList printList(LinkedList L) { 187 Node *p = L->next; 188 printf("Now List:"); 189 /*练习:链表顺序输出*/ 190 printf("\n"); 191 return L; 192 } 193 LinkedList printtsiL(LinkedList L) { //练习:改成栈结构实现 194 if(L != NULL) { 195 printtsiL(L->next); 196 if(!L->type) { 197 printf("%d ", L->data); 198 } 199 else { 200 printf("\n"); 201 } 202 } 203 return NULL; 204 } 205 //////////////////////////////////////////// 206 // 单链表的释放 // /*练习*/ 207 //////////////////////////////////////////// 208 LinkedList LinkedListfree(LinkedList L) { 209 /*自己写*/ 210 return L; 211 }
标签:
原文地址:http://www.cnblogs.com/bread/p/4220518.html