C语言实现线性表之链表算法

链表的各种算法,包括初始化,插入,删除,排序等操作,以下为代码:

  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 }

以下为运行结果:

在本程序中需要重点注意遍历,插入及删除三个算法

原文地址:https://www.cnblogs.com/hymhblf/p/3199785.html