单链表

来源:互联网 发布:mysql安装教程5.7.17 编辑:程序博客网 时间:2024/05/21 17:56
//单链表// 引用库函数#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 0