链表的基本操作

 

#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);
}
posted @ 2008-07-08 14:44  齐心  Views(656)  Comments(0Edit  收藏  举报