ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

【数据结构】链表

【数据结构】链表

链表的头尾操作及按位置操作

一、main函数

 #include <stdio.h>#include <stdlib.h>#include "./3.linklist.h"int main(int argc, const char *argv[]){linkList* head = create_linkList();//头插法插入数据 insertHead_linklist(head,10);insertHead_linklist(head,20);insertHead_linklist(head,30);insertHead_linklist(head,40);insertHead_linklist(head,50);show_linklist(head);   // 遍历链表 //尾插法插入数据 insertEnd_linklinst(head,99);insertEnd_linklinst(head,88);insertEnd_linklinst(head,77);insertEnd_linklinst(head,66);                                           show_linklist(head);delHead_linklist(head);     //头删法删除数据show_linklist(head);delEnd_linklist(head);      //尾删法删除数据show_linklist(head);insertByindex_linklist(head,2,10086); //按位置插入数据show_linklist(head);delByindex_linklist(head,6);        //按位置删除数据show_linklist(head);selectByindex_linklist(head,5);     //按位置查找数据freelink(head);                 //释放链表return 0;}

二、功能函数

#include <stdio.h>                                                                                                     
#include <stdlib.h>                                                                                                    
#include "./3.linklist.h"                                                                                              //创建链表                                                                                                             
linkList*create_linkList(void)                                                                                         
{                                                                                                                      linkList* head = (linkList*)malloc(sizeof(linkList));                                                              if(NULL == head)                                                                                                   {                                                                                                                  printf("头结点申请失败,创建单链表失败\n");                                                                    return NULL ;                                                                                                  }                                                                                                                  head->text.len =0;                                                                                                 head->next = NULL ;                                                                                                return head;                                                                                                       
}                                                                                                                      //释放链表                                                                                                             
void freelink(linkList*temp)                                                                                           
{                                                                                                                      free(temp);                                                                                                        return;                                                                                                            
}                                                                                                                      void insertHead_linklist(linkList*head,dataType num)     //头插法插入数据                                              
{                                                                                                                      linkList*temp = (linkList*)malloc(sizeof(linkList));                                                               if(NULL == temp)                                                                                                   {                                                                                                                  printf("结点申请失败,头插失败\n");                                                                            return ;                                                                                                       }                                                                                                                  temp->text.data= num;                                                                                              temp->next = NULL ;                                                                                                temp->next=head->next;                                                                                             head->next=temp;                                                                                                   head->text.len++;       //更新链表长度                                                                             return ;                                                                                                           
}                                                                                                                      void show_linklist(linkList*head)      //遍历链表                                                                      
{                                                                                                                      linkList*p=head;                                                                                                   while(p->next != NULL)                                                                                             {                                                                                                                  p=p->next;                                                                                                     printf("%d ",p->text.data);                                                                                    }                                                                                                                  printf("\n");                                                                                                      return ;                                                                                                           
}                                                                                                                      void insertEnd_linklinst(linkList*head,dataType num)  //尾插法插入数据                                                 
{                                                                                                                      linkList* p =head;                                                                                                 while(p->next != NULL )                                                                                            {                                                                                                                  p=p->next;                                                                                                     }                                                                                                                  linkList*temp = (linkList*)malloc(sizeof(linkList));                                                               if( NULL == temp)                                                                                                  {                                                                                                                  printf("结点申请失败,尾插失败\n");                                                                             return ;                                                                                                       }                                                                                                                  temp->text.data = num;                                                                                             temp->next = NULL ;                                                                                                p->next=temp;                                                                                                      head->text.len++;                                                                                                  return ;                                                                                                           
}                                                                                                                      int isEmpty_linklist(linkList*head)                                                                                    
{                                                                                                                      return head->next == NULL?1:0;                                                                                     
}                                                                                                                      
//头删法删除数据                                                                                                       
void delHead_linklist(linkList*head)                                                                                   
{                                                                                                                      if(isEmpty_linklist(head))                                                                                         {                                                                                                                  printf("链表为空,头删失败\n");                                                                                return ;                                                                                                       }                                                                                                                  linkList*temp=head->next;                                       head->next=head->next->next ;                                   head->text.len--;                                               freelink(temp);                                                 return ;                                                        }                                                                   //尾删法删除数据                                                    
void delEnd_linklist(linkList*head)                                 
{                                                                   if(isEmpty_linklist(head))                                      {                                                               printf("链表为空,尾删失败\n");                             return ;                                                    }                                                               linkList*p=head;                                                while(NULL != p->next->next)                                    {                                                               p=p->next;                                                  }                                                               linkList*temp=p->next;                                          p->next=NULL;                                                   head->text.len--;                                               freelink(temp);                                                 return ;                                                        
}                                                                   //按位置插入数据                                                    
void insertByindex_linklist(linkList*head,int index,dataType num)   
{                                                                   if(index<1 || index>head->text.len+1)                           {                                                               printf("位置非法,插入失败\n");                             return ;                                                    }                                                               int i=1;                                                        linkList*p=head;                                                for(i;i<index;i++)                                              {                                                               p=p->next;                                                  }                                                               linkList*temp = (linkList*)malloc(sizeof(linkList));            if(NULL == temp)                                                {                                                               printf("结点申请失败,插入失败\n");                          return ;                                                    }                                                               temp->text.data=num;                                            temp->next=p->next;                                             p->next = temp;                                                 head->text.len++;                                               return ;                                                        /按位置删除数据                                                    
oid delByindex_linklist(linkList*head,int index)                   if(index<1 || index>head->text.len+1)                           {                                                               printf("位置非法,删除失败\n");                             return ;                                                    }                                                               if(isEmpty_linklist(head))                                      {                                                               printf("链表为空,无法进行删除\n");                         return ;                                                    }                                                               int i=1;                                                        linkList*p=head;                                                for(i;i<index;i++)                                              {                                                               p=p->next;                                                  }                                                               linkList*temp=p->next;                                          p->next=p->next->next;                                          freelink(temp);                                                 head->text.len--;                                               return;                                                         
}                                                           //按位置查找数据                                            
void selectByindex_linklist(linkList*head,int index)        
{                                                           if(index>head->text.len)                                {                                                       printf("位置非法,无法查询\n");                     return ;                                            }                                                       int i=1;                                                linkList*p=head;                                        for(i;i<=index;i++)                                     {                                                       p=p->next;                                          }                                                       printf("%d\n",p->text.data);                            return ;                                                
}                                                           //直接插入排序                                              
void insertSort_linklist(linkList*head,dataType num)        
{                                                           linkList*temp = (linkList*)malloc(sizeof(linkList));    if( NULL == temp)                                       {                                                       printf("结点申请失败,插入失败\n");                  return ;                                            }                                                       temp->text.data = num;                                  temp->next=NULL;                                        linkList* p= head;                                      while(p->next != NULL)                                  {                                                       if(temp->text.data <= p->text.data)                 {                                                   break;                                          }                                                   else                                                {                                                   p=p->next;                     }                                  }                                      temp->next=p->next;                    p->next=temp->next;                    head->text.len++;                      return;                                
}                                          

三、头文件

#ifndef __LINKLIST_H__                 
#define __LINKLIST_H__                 typedef int dataType;union msg{dataType data;int len;
};typedef struct node{union msg text;struct node* next;
}linkList;linkList*create_linkList(void);
void freelink(linkList*head);
void insertHead_linklist(linkList*head,dataType num);
void insertEnd_linklinst(linkList*head,dataType num);
void show_linklist(linkList*head);
void delHead_linklist(linkList*head);
void delEnd_linklist(linkList*head);
void insertByindex_linklist(linkList*head,int index,dataType num);
void delByindex_linklist(linkList*head,int index);
void selectByindex_linklist(linkList*head,int index);                            
void insertSort_linklist(linkList*head,dataType num);
#endif

四、makefile文件

-include ./Makefile.cfg$(Target):$(Obj)@$(CC) $^ -o $@%.o:%.c@$(CC) $^ $(CAN) $@clean:@rm $(Obj) $(Target)                

五、Makefile.cfg文件

Obj:= 1.main.o 2.linklist.o                            
Target:=a.outCC:=gcc
CAN:=-c -o

六、运行结果

返回列表