带头结点的单链表的初始化、插入、删除、查询长度和输出元素

带头结点的单链表的初始化、插入、删除、查询长度和输出元素,源码如下:

  1 #include<stdio.h> 
  2 #include<math.h>
  3 #include<stdlib.h> 
  4 #include<malloc.h> 
  5 
  6 #define MAXSIZE 10 //定义顺序表最大长度
  7 #define TRUE 1
  8 #define FALSE 0
  9 #define OK 1
 10 #define ERROR 0
 11 #define INFEASIBLE -1
 12 #define LIST_INIT_SIZE 100
 13 #define LISTINCREMENT 10
 14 
 15 typedef int Element;
 16 
 17 typedef struct node{
 18     Element e;
 19     struct node* next;//这里只是声明了一个名为next的指针,指针本身也占内存空间,里面存放的始终是地址。 struct node* 表示指针的类型是 struct node,即指向的地址里存放的是一个结构体 
 20 }LNode, *Linklist;
 21 
 22 /**
 23 * 带头结点的单链表进行增删改查 
 24 * 头结点就可以指代整个链表了 
 25 */
 26 
 27 int main() {
 28     Linklist initLinklist(Linklist head);
 29     int getLength(Linklist head);
 30     Linklist insert(Linklist head, int k, Element e);
 31     Linklist del(Linklist head, int position);
 32     int find(Linklist head, int position);
 33     void output(Linklist head);    
 34     
 35     Linklist head;//头结点 
 36     
 37     head = initLinklist(head); 
 38     insert(head, 1,1);//只有头结点时,长度是0 ,插入位置从1开始算 
 39     insert(head, 2,2);
 40     insert(head, 3,3);
 41     insert (head,2,999);
 42     int listLength = getLength(head);
 43     printf("length is : %d \n",listLength); 
 44     output(head);
 45     
 46     find(head,2);
 47     
 48     del(head, 2); 
 49     listLength = getLength(head);
 50     printf("length is : %d \n",listLength);
 51     output(head);
 52     
 53     del(head, 1);
 54     printf("length is : %d \n",listLength); 
 55     listLength = getLength(head);
 56     output(head);
 57     
 58 }
 59 
 60 /**
 61 * 初始化单链表,建立一个头结点 
 62 */
 63 Linklist initLinklist(Linklist head){
 64     head = (Linklist)malloc(sizeof(LNode));
 65     head->next = NULL;
 66     printf("init single list successful! \n"); 
 67     return head;
 68 }
 69 
 70 /**
 71 * 插入元素 
 72 */
 73 Linklist insert(Linklist head, int k, Element e){
 74     int getLength(Linklist head);
 75     
 76     Linklist p = (Linklist)malloc(sizeof(LNode));//申请一个新节点
 77     Linklist pre = (Linklist)malloc(sizeof(LNode));//申请一个新节点
 78     int length = getLength(head);
 79     pre = head;
 80 
 81     if(k == length+1){    //在链表末尾添加新节点 
 82         while(pre->next) {
 83             pre = pre->next;
 84         }//循环结束时,pre已经到达链表末尾 
 85         p->e = e;
 86         pre->next = p;
 87         p->next = NULL;
 88     }else if(k > 0 && k <= length){//在链表中间添加节点 ,插入位置从1开始算 
 89         int j = 1;
 90         while(j < k) {
 91             pre = pre->next;
 92             j++;
 93         }//循环结束时,pre是要插入位置的前驱节点
 94         p->e = e;
 95         p->next = pre->next;
 96         pre->next = p; 
 97     }else{
 98         printf("插入的位置有误!\n");
 99     }
100     return head;
101 }
102 
103 /**
104 * 删除指定位置的链表元素  
105 */
106 Linklist del(Linklist head, int position) {
107     int getLength(Linklist head) ;
108     
109     int length = getLength(head);
110     if(position <= 0 || position > length ){
111         printf("删除位置有误!\n");
112     }else{
113         Linklist pre = (Linklist)malloc(sizeof(LNode));
114         Linklist key = (Linklist)malloc(sizeof(LNode));//key是被删除的元素 
115         pre = head;
116         int k = 1;
117         while(k < position){
118             pre = pre->next;
119             k++;
120         }//循环结束时,pre是被删除节点的前驱元素
121         key = pre->next;
122         key->e = pre->next->e; 
123         if(position == length) {//被删除的是链表末尾元素 
124             pre->next = NULL;
125         }else{//被删除的是链表中间元素 
126             pre->next = key->next;
127         } 
128         printf("删除的位置是%d, 删除位置的元素是%d \n", position, key->e) ;
129         free(key);
130     }
131     return head;
132 }
133 
134 /**
135 * 查询指定位置的链表元素  
136 */
137 int find(Linklist head, int position){
138     int getLength(Linklist head);
139     
140     Linklist pre = (Linklist)malloc(sizeof(LNode));
141     pre = head;
142     int length = getLength(head);
143     int k = 1;
144     if(position <= length){
145         while(k < position)    {
146             pre = pre->next;
147             k++;
148         }//循环结束时,pre是被查询节点的前驱元素
149         printf("------------------------------\n");
150         printf("位置%d的元素内容是%d\n", position,pre->next->e);
151         printf("------------------------------\n");
152     }else{
153         printf("查询位置有误!\n");
154     }
155 }
156 
157 /**
158 * 输出链表元素  
159 */
160 void output(Linklist head){
161     Linklist p = (Linklist)malloc(sizeof(LNode));//申请一个新节点
162     p = head;
163     do{    
164         p = p->next;
165         printf("%5d", p->e);
166     }while(p->next);
167     printf("\n");
168 }
169 
170 /**
171 * 求单链表的长度 
172 * 长度不算头结点 
173 */
174 int getLength(Linklist head){
175     int length = 0;
176     Linklist p = (Linklist)malloc(sizeof(LNode));//申请一个新节点
177     p = head;
178     while(p->next){
179         length++;
180         p = p->next;
181     }
182     return length;
183 }
运行结果如下:

 

posted @ 2021-03-02 10:46  sunshine233  阅读(545)  评论(0编辑  收藏  举报