单链表


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

typedef struct List
{ 
    char data; 
    struct List *next; 
}List; 
//创建单链表
List *list_create(void) 
{ 
    struct List *head,*tail,*p; 
    char e; 
    head=(List *)malloc(sizeof(List));  //申请头结点 
    tail=head; 
    printf("c\nList Create,input numbers(end of 0):"); 
    scanf("%c",&e); 
    while(e-0x30)
    { 
        p=(List *)malloc(sizeof(List)); //申请新结点
        p->data=e; 
        tail->next=p;            //将新结点链接至前一结点之后
        tail=p;                
        scanf("%c",&e);
    } 

    tail->next=NULL;   //最后结点指空
    return head; 
} 
//链表逆置
List *list_reverse(List *head) 
{ 
    List *p,*q,*r; 
    p=head; 
    q=p->next; 
    while(q!=NULL)  //判断是否还有结点
    { 
         r=q->next; //保留未逆转数据 
        q->next=p; //实现逆转,指向上一个结点
        p=q;      //以逆转结点
        q=r;     //需要逆转的结点
    } 

    head->next=NULL; //最后结点指空
    head=p; 
    return head; 
} 
//计算链表长度
int list_len(List *head)
{
    List *p;
    int len = 0;
    p = head->next;
    while (p != NULL)
    {
        len++;
        p = p->next;//指向下一个结点
    }
    printf("\n\n%d\n",len);
    return len;
}
//在index位置增加结点,数据为date
List *list_addnote(List *head, int index, char date)
{
    List *p,*pNew,*q;
    int i = 0;
    p = head;
    while (i < index)    //查找index位置
    {
        p = p->next;
        i++;
    }
    pNew = (List *)malloc(sizeof(List));//申请空间
    pNew->data = date;
    q = p->next;            //保存下一个结点
    p->next = pNew;         //插入
    pNew->next = q;            //将保存的结点链接置插入结点之后

    return head;
}
//删除值为date的结点
List *list_delnote(List *head, char date)
{
    List *p,*per; //per为前驱结点
    per = head;
    p = head->next;
    while (p->data != date)   //查找结点
    {
        per = p;
        p = p->next;
    }
    per->next = p->next; //前驱结点指向被删除的下一个
    free(p);

    return head;
}

void main(void) 
{ 
    struct List *head,*p; 
    head=list_create();
    list_addnote(head,2,'x');
    list_delnote(head,'a');
    printf("\n"); 
    for(p=head->next;p;p=p->next) 
    printf("--%c--",p->data); 

    head=list_reverse(head); 
    printf("\n");
    
    for(p=head;p->next;p=p->next) 
        printf("--%c--",p->data); 
    list_len(head);
}


 

 

 

posted @ 2015-11-02 20:05  黑暗里的影子  阅读(165)  评论(0编辑  收藏  举报