c语言版单链表
1 //c语言单链表 2 #include <stdio.h> 3 #include <stdlib.h> 4 typedef struct Node 5 { 6 int data;//数据域 7 struct Node *pNext;//指针域 8 }NODE,*PNODE;////NODE等价于struct Node PNODE等价于struct Node * 9 //函数声明 10 PNODE create_list();//创建链表 11 void traverse_list(PNODE pHead);//遍历链表 12 int is_empty(PNODE pHead);//判断链表是否为空 13 int length_list(PNODE);//求链表长度 14 int insert_list(PNODE pHead, int pos, int val);//在pHead所指向链表的第pos个节点的前面插入一个新的结点,该节点的值是val, 并且pos的值是从1开始 15 int delete_list(PNODE pHead, int pos, int *pVal);//删除链表第pos个节点,并将删除的结点的值存入pVal所指向的变量中, 并且pos的值是从1开始 16 void sort_list(PNODE);//对链表排序 17 18 PNODE create_list() 19 { 20 int len;//用来存放有效节点的个数 21 int i; 22 int val;//用来临时存放用户输入的节点的值 23 24 //分配一个存放有效数据的头结点 25 PNODE pHead = (PNODE)malloc(sizeof(NODE)); 26 if (pHead==NULL) 27 { 28 printf("内存分配失败,程序终止\n"); 29 exit(-1); 30 } 31 PNODE pTail = pHead; 32 pTail->pNext = NULL; 33 34 printf("请输入要生成的链表的节点个数:len="); 35 scanf("%d", &len); 36 37 for (i=0;i<len;++i) 38 { 39 printf("请输入第%d个节点的值", i + 1); 40 scanf("%d", &val); 41 42 PNODE pNew = (PNODE)malloc(sizeof(NODE)); 43 if (pNew==NULL) 44 { 45 printf("内存分配失败,程序终止\n"); 46 exit(-1); 47 } 48 pNew->data = val; 49 pTail->pNext = pNew; 50 pNew->pNext = NULL; 51 pTail = pNew; 52 } 53 return pHead; 54 } 55 void traverse_list(PNODE pHead) 56 { 57 PNODE p = pHead->pNext; 58 while (p!=NULL) 59 { 60 printf("%d ", p->data); 61 p = p->pNext; 62 } 63 printf("\n"); 64 65 return; 66 } 67 68 int is_empty(PNODE pHead) 69 { 70 if (pHead->pNext==NULL) 71 { 72 return 1; 73 } 74 else 75 { 76 return 0; 77 } 78 } 79 int length_list(PNODE pHead) 80 { 81 PNODE p = pHead->pNext; 82 int len = 0; 83 while (p!=NULL) 84 { 85 ++len; 86 p = p->pNext; 87 } 88 return len; 89 } 90 void sort_list(PNODE pHead) 91 { 92 int i, j, t; 93 int len = length_list(pHead); 94 PNODE p, q; 95 for (i=0,p=pHead->pNext;i<len-1;++i,p=p->pNext) 96 { 97 for (j=i+1,q=p->pNext;j<len;++j,q=q->pNext) 98 { 99 if (p->data>q->data)//类似a[i]>a[j] 100 { 101 t = p->data; 102 p->data = q->data; 103 q->data = t; 104 } 105 } 106 } 107 return; 108 } 109 110 int insert_list(PNODE pHead, int pos, int val) 111 { 112 int i = 0; 113 PNODE p = pHead; 114 115 while (p!=NULL&&i<pos-1) 116 { 117 p = p->pNext; 118 ++i; 119 } 120 if (i>pos-1||p==NULL) 121 { 122 return 0; 123 } 124 //如果程序能执行到这一行说明p已经指向了第pos-1个结点,但第pos-1个节点是否存在无所谓 125 //分配新的结点 126 PNODE pNew = (PNODE)malloc(sizeof(NODE)); 127 if (NULL == pNew) 128 { 129 printf("动态分配内存失败!\n"); 130 exit(-1); 131 } 132 pNew->data = val; 133 //将新的节点存入p节点的后面 134 PNODE q = p->pNext; 135 p->pNext = pNew; 136 pNew->pNext = q; 137 138 return 1; 139 } 140 141 int delete_list(PNODE pHead, int pos, int *pVal) 142 { 143 int i = 0; 144 PNODE p = pHead; 145 146 while (p->pNext!=NULL&&i<pos-1) 147 { 148 p = p->pNext; 149 ++i; 150 } 151 if (i>pos-1||p->pNext==NULL) 152 { 153 return 0; 154 } 155 //如果程序能执行到这一行说明p已经指向了第pos-1个结点,并且第pos个节点是存在的 156 157 PNODE q = p->pNext;//q指向待删除的节点 158 *pVal = q->data; 159 160 //删除p节点后面的节点 161 p->pNext = p->pNext->pNext; 162 163 //释放q所指向的节点所占的内存 164 free(q); 165 q = NULL; 166 167 return 1; 168 } 169 int main() 170 { 171 PNODE pHead = NULL; 172 int val,len; 173 pHead = create_list();//create_list()功能:创建一个非循环单链表,并将该链表的头结点的地址付给pHead 174 printf("链表是否为空:\n"); 175 if (is_empty(pHead)) 176 printf("链表为空!\n"); 177 else 178 printf("链表不空!\n"); 179 180 traverse_list(pHead); 181 printf("插入操作在第3个位置插入2\n"); 182 insert_list(pHead, 3, 2); 183 traverse_list(pHead); 184 printf("插入操作在第4个位置删除\n"); 185 if (delete_list(pHead, 4, &val)) 186 { 187 printf("删除成功,您删除的元素是: %d\n", val); 188 } 189 else 190 { 191 printf("删除失败!您删除的元素不存在!\n"); 192 } 193 traverse_list(pHead); 194 printf("求长度操作\n"); 195 len = length_list(pHead); 196 printf("链表的长度是%d\n", len); 197 printf("排序操作\n"); 198 sort_list(pHead); 199 traverse_list(pHead); 200 return 0; 201 }
道阻且长,行则将至

浙公网安备 33010602011771号