链表的基本操作

 

#include  < stdlib.h >
#include 
< stdio.h >

typedef 
struct  node 
{
    
int  data;
    
struct  node  * next;
}NODE;

NODE 
* head = NULL;

/* 函数声明 */
NODE 
* createlist_head( int  len);
NODE 
* createlist_end( int  len);
NODE 
* createlist_sort( int  len);
int  insert(NODE  * newNode, int  index);
void  insert_sort(NODE  * newNode);
void  display(NODE  * p);

/* 创建新节点 */
NODE 
* createNewNode()
{
    NODE 
* p;
    
int  c;
    scanf(
" %d " , & c);
    p
= (NODE  * )malloc( sizeof (NODE));
    p
-> data = c;
    p
-> next = NULL;
    
return  p;
}

/* 链表头部插入 */
NODE 
* createlist_head( int  len)
{
    NODE 
* p;
    
int  i,c;
    
for  (i = 0 ;i < len;i ++ )
    {
        p
= createNewNode();
        p
-> next = head;
        head
= p;
    }
    
return  head;
}

/* 链表尾部插入 */
NODE 
* createlist_end( int  len)
{
    NODE 
* p, * tail = head;
    
int  c,i;
    
for  (i = 0 ;i < len;i ++ )
    {
        p
= createNewNode();
        
if (head == NULL)
            head
= p;
        
else
            tail
-> next = p;
        tail
= p;
    }
    
return  head;
}

/* 按data成员值大小排序插入 */
NODE 
* createlist_sort( int  len)
{
    NODE 
* p;
    
int  c,i;
    
for  (i = 0 ;i < len;i ++ )
    {
        p
= createNewNode();
        insert_sort(p);
    }
    
return  head;
}

/* 按指定位置进行插入 */
int  insert(NODE  * newNode, int  index)        
{
    
int  i = 0 ;
    NODE 
* p;
    p
= head;
    
while  (p != NULL && i < index - 1 )
    {
        p
= p -> next;
        i
++ ;
    }
    
if (p == NULL)
        
return   0 ;
    
else
    {
        newNode
-> next = p -> next;
        p
-> next = newNode;
        
return   1 ;
    }
}

/* 按data成员值的大小排序插入 */
void  insert_sort(NODE  * newNode)            
{
    NODE 
* p1, * p2;                         // p1,p2记录指标指针位置,一前一后
    p1 = p2 = head;
    
while  (p1 != NULL)
    {
        
if  (p1 -> data < newNode -> data)         // 成员值比较
        {
            p2
= p1;
            p1
= p1 -> next;
        }
        
else
            
break ;
    }
    
/* 以下代码处理新节点插入位置的各种情况 */

    
if (head == NULL)                         // 如果头结点为空,即链表空
        head = newNode;
    
else   if (p1 == NULL)                     // 如果到达链表尾部
        p2 -> next = newNode;
    
else   if (p1 == head)                     // 如果p1指向头结点
    {
        newNode
-> next = p1;
        head
= newNode;
    }
    
else                                  // 如果p1指向中间节点
    {
        newNode
-> next = p1;
        p2
-> next = newNode;
    }
}

/* 显示链表内容 */
void  display(NODE  * p)
{
    NODE 
* q;
    q
= p;
    
while (q != NULL)
    {
        printf(
" %d\n " ,q -> data);
        q
= q -> next;
    }
    
//      while (p!=NULL)
//      {
//          q=p;
//          p=p->next;
//          free(q);
//      }
}

NODE 
* del( int  index)
{
    NODE 
* p, * q;
    
int  i = 0 ;
    p
= head;
    
while  (p -> next != NULL && i < index - 1 )
    {
        p
= p -> next;
        i
++ ;
    }
    
if (p -> next == NULL)
        
return  NULL;
    
else
    {
        q
= p -> next;
        p
-> next = q -> next;
        
return  q;
    }
}

NODE 
* search( char  value)
{
    NODE 
* p;
    p
= head;
    
while (p != NULL && p -> data != value)
        p
= p -> next;
    
return  p;
}

void  main()
{
    
int  flag;
    NODE 
* p;
//      display(createlist_sort(5));
//      display(createlist_head(5));
     display(createlist_end( 5 ));
    p
= createNewNode();
    flag
= insert(p, 3 );
    
if (flag)
        printf(
" 插入成功!\n " );
    
else
        printf(
" 插入失败!\n " );
    display(head);
    free(del(
3 ));
    display(head);
}

你可能感兴趣的:(基本操作)