指尖上的代码[C语言版]-<7>数据结构之单链表

来源:互联网 发布:淘宝劵 编辑:程序博客网 时间:2024/05/01 21:43

<7>数据结构之单链表

由于每次分析画图浪费太多时间,所以博客的分析配图就不上了!不明白的可以给我留言!

代码:

#include "stdio.h"#include "stdlib.h"#define DataType int#define Type "%d"/*全局变量*/int flag=0;typedef struct node{  DataType data;  /*数据域*/  struct node *next;     /*指针域指向下一个结点*/} linktable;linktable *new,*head;/*函数声明*/void Create();void Print();void UpInsert();void DownInsert();void Delete();int GetMax();/*主函数*/int main(void){  int options;  printf("数据结构>>单链表\n");  printf("1.初始化单链表\n");  printf("2.遍历单链表\n");  printf("3.在位置前插入数据\n");  printf("4.在位置后插入数据\n");  printf("5.按位置删除数据\n");  printf("6.退出\n");  while(1)       {         printf("请输入选项进行操作(1-6):");         scanf("%d",&options);         switch(options)               {                   case 1:Create();break;                   case 2:Print();break;                   case 3:UpInsert();break;                   case 4:DownInsert();break;                   case 5:Delete();break;                   case 6:exit(0);break;                   default:printf("请输入1-6之间的数字进行选择!\n");               }       }  return 0;}/*初始化单链表*/void Create(){  int n,i;  DataType x;  linktable *l;  printf("请输入你要创建的链表的长度:");  scanf("%d",&n);  for(i=1;i<=n;i++)     {       new=(linktable *)malloc(sizeof(linktable));       printf("请输入第%d个元素的值:",i);       scanf(Type,&x);       new->data=x;       new->next=NULL;       if(i==1)         {           l=new;           head=l;         }       else         {           l->next=new;           l=new;         }     }    printf("单链表初始化完成!\n");  flag=1;}/*遍历函数*/void Print(){  linktable *p;  p=head;  if(flag==0)    {      printf("请先初始化单链表!\n");    }  else    {          do           {             printf(Type,p->data);             printf("  ");             p=p->next;           } while(p!=NULL);      printf("\n");    }}/*插入函数(在前面插)*/void UpInsert(){  int max,locate,i=0,x;  linktable *p;  p=head;  max=GetMax();  if(flag==0)    {      printf("请先初始化单链表!\n");    }  else    {      printf("你想在那个位置插入元素(0<位置<=%d):",max);       scanf("%d",&locate);      if(locate>max||locate<=0)        {          printf("你输入的位置不存在!\n");          UpInsert();        }       else        {          printf("请输入你要插入元素的值:");          scanf(Type,&x);          new=(linktable *)malloc(sizeof(linktable));          new->data=x;          new->next=NULL;          if(locate==1)            {              new->next=head;              head=new;            }          else            {               for(i=0;i<locate-2;i++)                 {                   p=p->next;                   }               new->next=p->next;               p->next=new;            }        }      printf("元素已插入成功!\n");      Print();    }}/*插入函数(在后面插)*/void DownInsert(){  int max,locate,i=0,x;  linktable *p;  p=head;  max=GetMax();  if(flag==0)    {      printf("请先初始化单链表!\n");    }  else    {      printf("你想在那个位置插入元素(0<位置<=%d):",max);      scanf("%d",&locate);      if(locate>max||locate<=0)        {          printf("你输入的位置不存在!\n");          UpInsert();        }      else        {          printf("请输入你要插入元素的值:");          scanf(Type,&x);          new=(linktable *)malloc(sizeof(linktable));          new->data=x;          new->next=NULL;          for(i=0;i<locate-1;i++)             {               p=p->next;             }          if(locate==max)            {              p->next=new;            }          else            {              new->next=p->next;              p->next=new;            }        }       printf("元素已插入成功!\n");       }}/*删除函数*/void Delete(){  int max,locate,i;  linktable *p1,*p2;  p1=head;  max=GetMax();  if(flag==0)    {      printf("请先初始化单链表!\n");    }  else    {      if(head!=NULL)        {          printf("请输入你要删除的元素的位置(0<位置<=%d):",max);          scanf("%d",&locate);          if(locate>max||locate<=0)            {              printf("你输入的位置不存在!\n");              Delete();            }          else            {              if(locate==1)                {                  head=p1->next;                  free(p1);                         }              else                {                  for(i=0;i<locate-2;i++)                     {                       p1=p1->next;                     }                  p2=p1->next;                  if(locate==max)                    {                      p1->next=NULL;                      free(p2);                    }                  else                    {                      p1->next=p2->next;                      free(p2);                    }                }              printf("元素删除成功!\n");            }        }      else        {          printf("单链表中已没有数据,请重新初始化后再进行操作!\n");        }    }}int GetMax()  /*获取当前单链表中元素的个数*/{  int max=0;  linktable *p;  p=head;  while(p!=NULL)       {         max++;         p=p->next;       } return max;}

编译结果:


点石成金  写于  2012/08/17/00:12