单链表

//单链表

// 引用库函数
#include<stdio.h>
#include<Stdlib.h> /*含ma l l o c ( ) 的头文件*/  

//定义Elemtype元素类型  
typedef int     Elemtype;  //   



//定义结构体
typedef struct LNode{
    Elemtype data;    //数据域 
    struct LNode *next;  //指针域  
}Node,*LinkList;   //LNode,*LinkList相当于 LNode的别名 




//函数声明
void ListPrintf(Node *l);
LinkList Link_init(); 
 LinkList Link_addhead();   //头插 
  LinkList Link_addtail();  //尾插
  LinkList Link_add(LinkList l,int i);   //插入到第i个位置上 
  LinkList datasolid(); 
  LinkList LocateElemByData(LinkList l,int i);  //按值查找结点值 
  LinkList LocateElemByID(LinkList l,int i);  //按序号查找结点值 
  LinkList Link_delete(LinkList l,int i);    //删除结点操作
  int  GetLength(LinkList l);       //求表长操作
 

#include <stdio.h>
int main()
{
    Node *list,*p; 
    int x,i; 
   printf(" 请选择 操作!\n"); 
   printf(" 1.头插法加入结点\n"); 
   printf(" 2.尾插法加入结点\n");
   printf(" 3.数据固化\n");    
   printf(" 4.按值查找结点值\n");    
   printf(" 5.按序号查找结点值 \n");  
   printf(" 6.在第 i个位置上插入新的结点 \n");  
   printf(" 7.在第 i个位置删除结点 \n");  
   printf(" 8.求表长操作 \n");  
   scanf("%d",&x);
   switch(x)
   {
    case 1: list = Link_addhead();   ListPrintf(list);  break; 
    case 2: list = Link_addtail();   ListPrintf(list);  break;   
    case 3: list =  datasolid();   ListPrintf(list);  break;  
    case 4: list =  datasolid();  printf("请输入你要查找的元素的值 \n");
            scanf("%d",&i);  p=LocateElemByData(list,i);     break;  
    case 5: list =  datasolid();  printf("请输入你要查找的结点位置i \n");
               scanf("%d",&i);  
            p=LocateElemByID(list,i); printf("查到的结点值:%d \n",p->data); break;     
    case 6: list =  datasolid(); 
            printf("请输入你要插入的结点位置i \n");
            scanf("%d",&i);  
            Link_add(list,i) ; ListPrintf(list);break;
   case 7:  list =  datasolid(); 
            printf("请输入你要删除的结点位置i \n");
            scanf("%d",&i); 
             Link_delete(list,i); 
               ListPrintf(list); break;
   case 8:  list =  datasolid(); 
            int i =GetLength(list);
            printf("链表长度为:%d \n",i);

               ListPrintf(list); break;
   } 




    printf("\n");  
    return 0;
}

//单链表的初始化
LinkList Link_init()
{
    Node *l;
    l=(LinkList)malloc(sizeof(Node));  //申请结点空间
    if(l == NULL)
       printf("申请内存空间失败 \n");
       l->next = NULL;  //将next设置为NULL,初始长度为0的单链表

       return l;
}

//打印链表 
 void ListPrintf(Node *l)
 {
    Node *list,*start;
    list =l;
      printf("打印链表:"); 
       for(start = list->next; start != NULL; start = start->next)  
    {
        printf("%d ",start->data);  
    }
 } 
 //单链表的建立法一,头插法建立单链表 
 LinkList Link_addhead()
 {
    Node *l,*s;
    LinkList p1;
    s=l;
    Elemtype x =1;      //x为链表数据域中的数据  
    l=  Link_init();  //初始化链表 

        printf("请输入你要加入的结点值");
        scanf("%d",&x);
        while(x!=0)
        {
          Node *p;  
        p = (LinkList)malloc(sizeof(Node));   //申请新的结点   
        p->data = x;                     //结点数据域赋值   
        p->next = l->next;                    //将结点插入到表头L-->|2|-->|1|-->NULL   
        l->next = p;   
        printf("p结点的数据:%d \n",p->data);
         scanf("%d",&x);
        }   
    return l;   
 }

 //单链表的建立法一,尾插法建立单链表 
 LinkList Link_addtail()
 {
    Node *l,*r;  //r为新增 的表尾指针 
    l=  Link_init();  //初始化链表 
    r=l;
    int x;

        printf("请输入你要加入的结点值");
        scanf("%d",&x);


        while(x!=0)
        {
        Node *s;  
        s = (LinkList)malloc(sizeof(Node));   //申请新的结点  
        s->data = x;
        r->next=s;
        r=s;  
        printf("s结点的数据:%d \n",s->data);  
        scanf("%d",&x);   
        }
        r->next =NULL;
        return l;
 }

 //数据固化 
   LinkList datasolid()
   {
     Node *l,*r;  //r为新增 的表尾指针 
    l=  Link_init();  //初始化链表 
    r=l;
    int x[9]={
        11,22,33,44,55,66,0
     };

        printf("数据固化中......\n");
        int i=0;
        while(x[i]!=0)
        {
        Node *s;  
        s = (LinkList)malloc(sizeof(Node));   //申请新的结点  
        s->data = x[i];
        r->next=s;
        r=s;  
        i++; 
        }
        r->next =NULL;
        return l;
   } 

   //按序号查找结点值 
     LinkList LocateElemByID(LinkList l,int i) 
     {
        Node *p;
        int m=-1;
        //判断 i 的合法性
           if(i<1 )  printf("位置不合法!\n"); 
        for(p=l;p->next != NULL;p =p->next)
        {
            m++;
            if(m==i)
            {
                return p;
                break;
            }
        }
        if(p->next ==NULL){
          printf("没有这个位置!!\n"); 
          return NULL;  
        } 
     }

 //按值查找结点值 
   LinkList LocateElemByData(LinkList l,int i)
 {
    //遍历链表
     Node *p;
     for(p=l;p!=NULL;p=p->next)
     {
        if(p->data==i) 
            {
                printf("找到了这个元素!");
               return  p;  break; 
            }   
    } 
    if(p->next ==NULL) printf("没有这个元素!!\n");  return NULL; 
 } 

   LinkList Link_add(LinkList l,int i)  //插入到第i个位置上 
   {
      //先得到 i-1 个结点
         Node *m,*p;
         m = LocateElemByID(l,i-1);

        p= (LinkList)malloc(sizeof(Node));   //申请新的结点  
        printf("请输入新加入结点的值:\n");
        scanf("%d",&p->data); 
        p->next =m->next;
        m->next =p;
   } 


 //删除结点操作
  LinkList Link_delete(LinkList l,int i)
  {
    //先得到第 i-1个结点
     Node *m,*p;   //m为i-1结点,p为i结点 
     m = LocateElemByID(l,i-1);
     p=m->next;
     m->next=p->next;
     free(p);
    return  l;
  } 

  //求表长操作
  int  GetLength(LinkList l)
  {
    Node *p;
    int i=-1;
    for(p=l;p!=NULL;p=p->next)
    {
        i++;
      }
      return i;
  } 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值