自学内容网 自学内容网

【无标题】

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

typedef char datatype;

typedef struct node
{
    datatype data;
    struct  node  *next; 
}LNode, *LinkList;

LinkList InitList()   // 单链表的初始化,创建带头结点的空链表

    LinkList L;  
    L =(LinkList)malloc(sizeof(LNode)) ; //生成新结点作为头结点,用头指针L指向头结点
    L->next = NULL; //头结点的指针域置空
    return L;
}

LinkList  CreateFromHead() //头插入创建带头结点的单链表
{  
    LinkList L;
    LNode *s;
    char c;
    int flag=1;
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
    while(flag)
    {
        c=getchar();
        if(c!='$')
        {
            s=(LinkList)malloc(sizeof(LNode));
            s->data=c;
            s->next=L->next;
            L->next=s;
        }
        else
            flag=0;
    }
    return L;
}  

LinkList CreateFromTail()//尾插入创建单带头结点的链表
{
    LinkList L;
    LNode *s;
    LNode *r;
    char c;
    int flag=1;
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
    r=L;
    while(flag)
    {
        c=getchar();
        if(c!='$')
        {
            s=(LinkList)malloc(sizeof(LNode));
            s->data=c;
            r->next=s;
            r=s;
        }
        else
        {
            flag=0;
            r->next=NULL;
        }
        return L;
    }  

}

LinkList Getlist (LinkList L, int i)//获取单链表的第i个结点,i取值[1,n],返回第i个结点的指针
{   
    int j;
    LNode *p;
    p=L;
    j=0;
    while(p &&j<i)
    {
        p=p->next;
        j++;
    }
    if(i==j)
    {
        return p;
    }
    else
        return NULL;
}

int ListLength (LinkList L) //求单链表的长度
{   
    LinkList p;
    int j;
    p=L;
    j=0;
    while(p->next!=NULL)
    {
        p=p->next;
        j++;
    }
    return j;
}

int  LocateElem(LinkList L, datatype e)  //按值查找,e为待查找的字符,返回结点序号i
{
     int i;
    LinkList p;
    p = L->next;
    i=0;
    while (p && p->data != e)    //顺链域向后扫描,直到p为空或p所指结点的数据域等于e
    {
        i++;
        p = p->next;     //p指向下一个结点
    }        
    if(p)  return i;
    else 
        return -1;    //查找成功返回值为e的结点序号,0为未找到

 int InsList(LinkList L, int i, datatype e) 
 {
     LinkList pre,p;
     int k;
     pre=L;k=0;
     while(pre!=NULL&&k<i-1)
     {
         pre=pre->next;
         k=k+1;
     }
     if(k!=i-1)
     {
         printf("插入位置不合理");
         return 0;
     }
     p=(LinkList)malloc(sizeof(LNode));
     p->data=e;
     p->next=pre->next;
     pre->next=p;
     return 1;

int ListDelete(LinkList L, int i, datatype *e)   //单链表的删除,删除第i个结点
{     //在带头结点的单链表L中,删除第i个位置
    LinkList pre,r;
    int k;
    pre=L;
    k=0;
    while(pre->next!=NULL&&k<i-1)
    {
        pre=pre->next;
        k=k+1;
    }    
    if(k!=i-1)
    {
        printf("删除节点的位置i不合理");
        return 0;
    }
    r=pre->next;
    pre->next=pre->next->next;
    *e=r->data;
    free(r);
    return 1;

void PrintList(LinkList L) //输出单链表
{
    LinkList p;
    if(L==NULL)
    {
        printf("当前链表未建立。\n"); 
        return;
    }
       printf("当前链表数据读出:\n");   
    p = L->next;
    while(p!=NULL) 
    {
       printf("%c ",p->data);
       p = p->next;
    }
    printf("\n");
}

LinkList DestroyList(LinkList L) //销毁单链表
{
    LinkList q;    
    while(L!=NULL)
    {
        q=L;
        L=L->next;
        free(q);
    }
    printf("单链表已被销毁!\n");    
    L=NULL;
    return L;    
}

int main() 
{
    int i, n, choose;
    datatype data;
    LinkList  L=NULL,p;    
    printf(" 1. 创建带头结点的空链表\n");
    printf(" 2. 前插入法建立带头结点的单链表\n");
    printf(" 3. 后插入法建立带头结点的单链表\n");
    printf(" 4. 返回第i个结点的数据域值\n");
    printf(" 5. 按值查找结点,返回结点序号\n");
    printf(" 6. 在第i个结点前插入值\n");
    printf(" 7. 将第i个结点删除\n");
    printf(" 8. 求单链表的长度\n");
    printf(" 9. 输出所有结点数据域信息\n");
    printf(" 10. 销毁单链表\n");
    printf(" 0. 退出\n\n");

    choose = -1;
    while (choose != 0) 
    {
        printf("请选择:");
        scanf("%d",&choose);
        switch (choose) {
        case 1: //建立一个单链表
            L=InitList();
            if (L!=NULL)
                printf("成功建立空链表!\n");
            break;
        case 2: //使用前插法创建单链表
            data=getchar(); //获取选择2后的换行符\n--10,防止被创建的单链表结点接收到
            printf("%d\n",data);  //验证上一行的结果,输出10,此语句可以省略
            L=CreateFromHead( );
            if(L!=NULL)
                printf("头插法创建单链表完毕\n");
            break;
        case 3: //使用后插法创建单链表
            getchar();//获取选择3后的换行符\n--10,防止被创建的单链表结点接收到
            L=CreateFromTail( );
            if(L!=NULL)
                printf("尾插法创建单链表完毕\n");
            break;
        case 4: //单链表的按序号取值                
            if(L!=NULL)
            {
                printf("请输入一个位置用来取值:");
                scanf("%d",&i);
                p=Getlist(L,i);        
                if (p!=NULL) 
                {
                    printf("查找成功!第%d个结点的数据域为:%c\n",i,p->data);                
                } 
                else
                    printf("查找失败!\n");
            }
            else
                printf("单链表未建立\n");
            break;
        case 5: //单链表的按值查找
            getchar();
            if(L!=NULL)
            {
                printf("请输入所要查找的字符:");
                scanf("%c",&data);
                i = LocateElem(L,data);
                if (i!=-1) 
                {
                    printf("查找成功,字符%c所在的结点为第%d个结点\n",data,i);
                }             
                else
                    printf("查找失败! 字符%c没有找到\n" ,data) ;
            }
            else
                printf("单链表未建立\n");
            break;
        case 6: //单链表的插入            
            if(L!=NULL)
            {
                printf("\n请输入插入的位置和字符的信息\n");
                scanf("%d%c",&i,&data);
                if(InsList(L, i, data)==1)
                    printf("插入成功.\n");
                else
                    printf("插入失败!\n");
            }
            else
                printf("单链表未建立\n");
            break;
        case 7: //单链表的删除
            if(L!=NULL)
            {
                printf("请输入所要删除的结点的位置:");
                scanf("%d",&i);
                if (ListDelete(L, i,&data)==1)
                    printf("删除成功!,此结点的数据域为:%d。\n",data);
                else
                    printf("删除失败!\n");
            }
            else
                printf("单链表未建立\n");
            break;
        case 8: //单链表的结点个数
            if(L!=NULL)
            {
                n =ListLength(L);
                printf("单链表的结点个数为:%d\n",n);
            }
            else
                printf("单链表未建立\n");    
            break;
        case 9: //单链表的输出
            PrintList(L);
            break;
        case 10: //单链表的输出
            L=DestroyList(L);                
            break;
        }
    }
    return 0;
}


原文地址:https://blog.csdn.net/2401_82760239/article/details/142869830

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!