240702任伟超8.1作业

编写单链表程序:

程序1:main函数

1 #include <stdio.h>                                           
2 #include "./03_linklistFunc.h"                               
3                                                              
4 int main(int argc, const char *argv[])                       
5 {                                                            
6     Linklist* head;                                          
7     head = create_linklist();                                
8                                                              
9     insert_linklistByHead(head, 100);  //100                 
0     insert_linklistByHead(head, 200);  //200 100             
1     insert_linklistByHead(head, 300);  //300 200 100         
2     show_linklist(head);                                     
3                                                              
4     insert_linklistByWei(head, 666);  //300 200 100 666      
5     insert_linklistByWei(head, 999);  //300 200 100 666 999  
6     show_linklist(head);                                     
7                                                              
8     delete_linklistByHead(head);                             
9     show_linklist(head);           //200 100 666 999         
0     delete_linklistByHead(head);                             
1     show_linklist(head);           //100 666 999             
2     delete_linklistByHead(head);                             
3     show_linklist(head);           //666 999                 
4                                                              
5     return 0;                                                
6 }                                                            

程序2:头文件包含

 1 #ifndef __LINKLIST__                                                        
 2 #define __LINKLIST__                                                        
 3                                                                             
 4 typedef int datatype;                                                       
 5 typedef struct lklst                                                        
 6 {                                                                           
 7     union                                                                   
 8     {                                                                       
 9         int len;           //若是头结点,则用len存储链表长度                
10         datatype data;     //若是有效数据结点,则用data存放有效数据         
11     }text;             //数据域                                             
12                                                                             
13     struct lklst* next;//指针域,指向下一个结点,存储下一个结点的首地址     
14 }Linklist;                                                                  
15                                                                             
16 //创建一个空的单链表                                                        
17 Linklist* create_linklist(void);                                            
18 //头插法插入数据                                                            
19 void insert_linklistByHead(Linklist* head, datatype num);                   
20 //尾插法插入数据                                                            
21 void insert_linklistByWei(Linklist* head, datatype num);                    
22 //头删法删除数据                                                            
23 datatype delete_linklistByHead(Linklist* head);                             
24 //尾删法删除数据                                                            
25 //遍历链表                                                                  
26 void show_linklist(Linklist* head);                                         
27                                                                             
28 #endif                                                                      
                                                                               

程序3:功能函数

 #include <stdio.h>                                                    
 #include <stdlib.h>
 #include "./03_linklistFunc.h"
 
 
 //创建一个空的单链表
 Linklist* create_linklist(void)
 {
     //在堆空间中申请了头结点的空间,头结点的首地址存储在head指针中
     //head指针就是头指针
     Linklist* head = (Linklist*)malloc(sizeof(Linklist));
     if(NULL == head)
     {
         printf("创建单链表失败\n");
         return NULL;
     }
     //初始化头结点中的len
     head->text.len = 0;
     head->next = NULL;
 
     return head;
 }
 
 
 //头插法插入数据
 void insert_linklistByHead(Linklist* head, datatype num)
 {
     //创建一个新的结点temp
     Linklist* temp = (Linklist*)malloc(sizeof(Linklist));
     if(NULL == temp)
     {
         printf("创建结点失败,头插失败\n");
         return ;
     }
     temp->text.data = num;       //数据域赋值
     temp->next = NULL;      //指针域赋值
 
     //将temp头插法插入链表
     temp->next = head->next;
     head->next = temp;
 
     //更新头结点中链表的长度
     head->text.len++;
 
     return ;
 }
 
 //尾插
 void insert_linklistByWei(Linklist* head, datatype num)
 {
     //创建一个新的结点temp  
     Linklist* temp = (Linklist*)malloc(sizeof(Linklist));
     if(NULL == temp)
     {
         printf("创建结点失败,尾插失败\n");
         return ;
     }
     temp->text.data = num;       //数据域赋值
     temp->next = NULL;      //指针域赋值
 
     //找尾结点p的位置:循环判断p->next是否为NULL
     Linklist* p=head;
     while(NULL != p->next)
     {
         p=p->next;
     }
 
     //将temp尾插法插入链表
     temp->next=NULL;      //或者temp->next=p->next;
     p->next=temp;
     //更新头结点中链表的长度
     head->text.len++;
 
     return ;
 }
 
 //头删
 datatype delete_linklistByHead(Linklist* head)
 {
 
     //先判断链表是否为NULL
     if(NULL == head->next)
     {
         printf("链表为空,头删除失败\n");
     }
     //备份要释放的结点地址
     Linklist* temp =head->next;
     //修改head指针域中的地址,为要释放的结点的后一个结点的地址
     head->next=temp->next;   //或者head->next = head->next->next;
     //保存要释放的结点数据域中存储的数据,作为验证
     datatype num = temp->text.data;
     //释放结点,防止temp变野指针,指向NULL
     free(temp);
     temp=NULL;                                                       
     //更新头结点中链表的长度
     head->text.len++;
 
     return num;
 }
 
 //遍历链表
 void show_linklist(Linklist* head)
 {
     Linklist* p = head;
     while(p->next != NULL)
     {
         p=p->next;
         printf("%d ", p->text.data);
     }
     putchar(10);
 
     return ;
 }
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值