链表的各种算法,包括初始化,插入,删除,排序等操作,以下为代码:
1 # include <stdio.h> 2 # include <malloc.h> 3 # include <stdlib.h> 4 5 typedef struct LinkList{ 6 int data; 7 struct LinkList * next; 8 }NODE, * PNODE; 9 10 //链表初始化 11 PNODE init(); 12 //插入元素 13 bool insert(PNODE pHead,int pos,int val); 14 //删除元素 15 bool deleteLink(PNODE pHead,int pos); 16 //判断是否为空 17 bool isEmpty(PNODE pHead); 18 //获取长度 19 int getLength(PNODE pHead); 20 //获取某个位置的元素 21 int getValueByPos(PNODE pHead,int pos); 22 //排序 23 void sort(PNODE pHead); 24 //输出 25 void trverser(PNODE pHead); 26 27 int main(int argc, char *argv[]) 28 { 29 //初始化链表 30 PNODE pHead=init(); 31 trverser(pHead); 32 //在第0个位置插入元素 33 insert(pHead,0,10); 34 //第一个位置插入 35 insert(pHead,1,20); 36 trverser(pHead); 37 //最后位置插入 38 insert(pHead,getLength(pHead),30); 39 trverser(pHead); 40 //最后位置附加一个元素 41 insert(pHead,getLength(pHead)+1,40); 42 trverser(pHead); 43 //中间位置插入一个元素 44 insert(pHead,2,50); 45 trverser(pHead); 46 //删除第0个位置的元素 47 deleteLink(pHead,0); 48 trverser(pHead); 49 //删除第1个位置的元素 50 deleteLink(pHead,1); 51 trverser(pHead); 52 //删除最后一个位置的元素 53 deleteLink(pHead,getLength(pHead)); 54 trverser(pHead); 55 //删除第3个位置的元素 56 deleteLink(pHead,3); 57 trverser(pHead); 58 //获取第3个位置的元素 59 int t=getValueByPos(pHead,3); 60 printf("第3位置的元素为%d ",t); 61 sort(pHead); 62 printf("元素排序:"); 63 trverser(pHead); 64 return 0; 65 } 66 67 //链表初始化 68 PNODE init(){ 69 int length=0; 70 printf("请输入初始化的长度:"); 71 scanf("%d",&length); 72 //创建头结点 73 PNODE pHead=(PNODE)malloc(sizeof(NODE)); 74 if(NULL==pHead){ 75 printf("内存分配失败,程序退出! "); 76 exit(-1) ; 77 } 78 //创建一个中间变量 79 PNODE p=pHead; 80 p->next=NULL; 81 int t=0; 82 for(int i=0;i<length;i++) 83 { 84 PNODE pNew=(PNODE)malloc(sizeof(NODE)); 85 if(NULL==pNew){ 86 printf("内存分配失败,程序退出! "); 87 exit(-1) ; 88 } 89 printf("请输入第%d个节点的值:",i+1); 90 scanf("%d",&t); 91 pNew->data=t; 92 p->next=pNew; 93 p=pNew; 94 p->next=NULL; 95 } 96 return pHead; 97 } 98 99 //插入元素 100 bool insert(PNODE pHead,int pos,int val){ 101 //判断位置是否合法 102 int length=getLength(pHead); 103 if(pos<1||pos>length+1){ 104 printf("该链表只有%d个元素,您插入元素的位置不合法! ",length); 105 return false; 106 } 107 //删除指定位置的元素 108 PNODE p=pHead; 109 int i=0; 110 for(;i<pos-1;i++) 111 { 112 p=p->next; 113 } 114 PNODE pNew=(PNODE)malloc(sizeof(NODE)); 115 if(NULL==pNew) 116 { 117 printf("内存分配失败,程序退出! "); 118 exit(-1); 119 } 120 121 pNew->data=val; 122 pNew->next=p->next; 123 p->next=pNew; 124 return true; 125 } 126 //删除元素 127 bool deleteLink (PNODE pHead,int pos){ 128 //判断是否为空 129 if(isEmpty(pHead)) 130 { 131 printf("链表为空,无法删除指定位置的元素! "); 132 return false; 133 } 134 //判断位置是否合法 135 int length=getLength(pHead); 136 if(pos<1||pos>length){ 137 printf("该链表只有%d个元素,您删除元素的位置不合法! "); 138 return false; 139 } 140 //删除指定位置的元素 141 PNODE p=pHead; 142 int i=0,result=0; 143 for(;i<pos-1;i++) 144 { 145 p=p->next; 146 } 147 PNODE pDel=p->next; 148 p->next=p->next->next; 149 free(pDel); 150 return result; 151 152 } 153 //判断是否为空 154 bool isEmpty(PNODE pHead){ 155 if(NULL==pHead->next){ 156 return true; 157 } 158 return false; 159 } 160 //获取长度 161 int getLength(PNODE pHead){ 162 int length=0; 163 PNODE p=pHead->next; 164 while(NULL!=p) 165 { 166 length++; 167 p=p->next; 168 } 169 return length; 170 } 171 //获取某个位置的元素 172 int getValueByPos(PNODE pHead,int pos){ 173 int length=getLength(pHead); 174 if(pos<1||pos>length){ 175 printf("该链表只有%d个元素,您取元素的位置不合法,程序将输出0! "); 176 return 0; 177 } 178 PNODE p=pHead->next; 179 int i=1,result=0; 180 while(NULL!=p) 181 { 182 if(i==pos){ 183 result=p->data; 184 break; 185 } 186 p=p->next; 187 i++; 188 } 189 return result; 190 } 191 //排序 192 void sort(PNODE pHead){ 193 int t=0,i=0,j=0; 194 int length=getLength(pHead); 195 PNODE p=pHead->next; 196 PNODE pNext=p->next; 197 for(i=0;i<length,NULL!=p;i++,p=p->next) 198 { 199 for(j=i+1,pNext=p->next;j<=length,NULL!=pNext;pNext=pNext->next,j++){ 200 if(p->data>pNext->data){ 201 t=pNext->data; 202 pNext->data=p->data; 203 p->data=t; 204 } 205 } 206 } 207 208 } 209 //输出 210 void trverser(PNODE pHead){ 211 PNODE p=pHead->next; 212 while(NULL!=p) 213 { 214 printf("%d ",p->data); 215 p=p->next; 216 } 217 printf(" "); 218 }
以下为运行结果:
在本程序中需要重点注意遍历,插入及删除三个算法