关于单链表的插入和删除

/*不允许重复字符串的插入;根据输入的字符串,找到相应的结点并删除。修改程序: *//*(1)增加插入结点的功能。 *//*(2)将建立链表的方法改为头插入法。 */ 
编译 dev-cpp

 

#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"ctype.h"
typedef struct node          //定义结点   
{    
     char data[10];             //结点的数据域为字符串    
     struct node *next;      //结点的指针域   
}ListNode;
typedef ListNode * LinkList;         // 自定义LinkList单链表类型LinkList CreatListR1();              //函数,用尾插入法建立带头结点的单链表ListNode *LocateNode();              //函数,按值查找结点void DeleteList();                  
 //函数,删除指定值的结点void printlist();                   
 //函数,打印链表中的所有值void DeleteAll();void Insertlist();                   
 //函数,删除所有结点,释放内存 
//==按值查找结点,找到则返回该结点的位置,否则返回NULL==
ListNode *LocateNode(LinkList head, char *key)
{    
    ListNode *p=head->next; //从开始结点比较    
    while(p&&strcmp(p->data,key)!=0)  //直到p为NULL或p->data为key止        
         p=p->next;        //扫描下一个结点    
    return p;    //若p=NULL则查找失败,否则p指向找到的值为key的结点
} //==========用头插入法建立带头结点的单链表===========
LinkList CreatListR1(void) 
{    
    char ch[10];    
    LinkList head=(LinkList)malloc(sizeof(ListNode)); //生成头结点    
    ListNode *s,*r,*pp;    
    r=head;    
    r->next=NULL;    
    printf("Input # to end\n  ");  //输入"#"代表输入结束    
    printf("Please input Node_data:");    
    scanf("%s",ch);           //输入各结点的字符串    
    while(strcmp(ch,"#")!=0) {                 
        pp=LocateNode(head,ch);      //按值查找结点,返回结点指针     
        if(pp==NULL) {            //没有重复的字符串,插入到链表中                
            s=(ListNode *)malloc(sizeof(ListNode));        
            strcpy(s->data,ch);            
            s->next=r->next;           
            r->next=s;         
        }        
        printf("Please input Node_data:");            
        scanf("%s",ch);    
    }   
    return head;        //返回头指针
}
//==========删除带头结点的单链表中的指定结点=======
void DeleteList(LinkList head,char *key)
{   
    ListNode *p,*r,*q=head;    
    p=LocateNode(head,key);    //按key值查找结点的    
    if(p==NULL ) {            //若没有找到结点,退出    
        printf("position error");        
        exit(0);    
    }    
    while(q->next!=p)        //p为要删除的结点,q为p的前结点        
        q=q->next;    
        r=q->next;    
        q->next=r->next;    
        free(r);                //释放结点
}
void Insertlist(LinkList head ,char *key1)
{    
       char a[10];    
       ListNode *s,*r;    
       printf("input the Insert_data:");    
       scanf("%s",a);r=LocateNode(head,key1);    
       s=(ListNode *)malloc(sizeof(ListNode));       
       strcpy(s->data,a);    
       s->next=r->next;    r->next=s;    
}
void printlist(LinkList head)
{    
      ListNode *p=head->next;       //从开始结点打印    
      while(p){    printf("%s,   ",p->data);        p=p->next;    }    
      printf("\n");
}
//==========删除所有结点,释放空间===========
void DeleteAll(LinkList head)
{
     ListNode *p=head,*r;    
     while(p->next){    r=p->next;        free(p);    p=r;     }
     free(p);
} 
//==========主函数==============
int  main()
{ 
     char ch[10],num[10],ch1[10];  
     LinkList head;  head=CreatListR1();       //用尾插入法建立单链表,返回头指针  
     printlist(head);             //遍历链表输出其值 
     printf(" Delete node (y/n):");  //输入"y"或"n"去选择是否删除结点  
     scanf("%s",num);  if(strcmp(num,"y")==0 || strcmp(num,"Y")==0){    
     printf("Please input Delete_data:");            
     scanf("%s",ch);            //输入要删除的字符串    
     DeleteList(head,ch);            printlist(head);
     system("pause");
     return 0;  
}  
printf("the position after:");  
scanf("%s",ch1);  
Insertlist(head,ch1);  
printlist(head);  
DeleteAll(head);            //删除所有结点,释放内存
}

 

  

 

posted @ 2013-10-14 14:06  smart0326  阅读(369)  评论(0)    收藏  举报