Diu 发表于 2013-12-1 21:35:34

今天写了个链表,供c语言初学者学习交流,大神勿喷,嘿嘿

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

typedef struct node
{
    int date;
        struct node *next;
}node;

node *creat_list(int n);
int empty_list(node *head);
int treval_list(node *head);
int delete_list(node *head,int i,int n);
int add_list(node *head,int i,int k,int n);

int main()
{
    node *phead = NULL;
        int n,j;
   
        printf("1:创建链表\n");
        printf("2:遍历链表\n");
        printf("3:删除节点\n");
        printf("4:插入节点\n");
        printf("5:退出程序\n");
    printf("请输入您想操作的编号:");

        while(1)
        {
           scanf("%d",&j);
           switch(j)
           {
              case 1:{
                                       printf("请输入您想创建的有效节点的个数:");
                                       scanf("%d",&n);
                                       phead = creat_list(n);
                                       break;            
                               }
                  case 2:{
                                 if(empty_list(phead))
                                       {
                                             printf("链表为空,遍历失败,请选择您的下一步操作序号:\n");
                                               break;
                                       }
                                       else
                                       {
                                             treval_list(phead);
                                               break;
                                       }
                                
                               }
                  case 3:{   
                                 int i;
                                       if(empty_list(phead))
                                       {
                                             printf("链表为空,删除节点失败,请选择您的下一步操作序号:\n");
                                               break;
                                       }
                                       else
                                       {
                                             printf("您想删除第几个节点:");
                                             scanf("%d",&i);
                                         if(!delete_list(phead,i,n))
                                               {
                                                    printf("删除节点失败,请选择您的下一步操作序号:\n");
                                               }
                                               break;
                                       }
                                       
                               }
                  case 4:{
                                     if(empty_list(phead))
                                       {
                                             printf("链表为空,插入节点失败,请选择您的下一步操作序号:\n");
                                               break;
                                       }
                                       else
                                       {
                                          int i,k;
                                                printf("请输入您想插入元素的位置:");
                                                scanf("%d",&i);
                                                printf("请输入您想插入的元素的值:");
                        scanf("%d",&k);
                                                if(!add_list(phead,i,k,n))
                                                {
                                                  printf("插入节点失败,请选择您的下一步操作序号:\n");
                                                }
                                                break;
                                       }
                               }
                  case 5:{
                                     exit(-1);
                               }
           }
           printf("请输入您的下一步操作:");   
        }
        return 0;
}

node *creat_list(int n)
{
   int i,k;
   node *head = (node *)malloc(sizeof(node));
   node *phead = head;
   head->next = NULL;

   for(i=1;i<=n;i++)
   {
      head->next = (node *)malloc(sizeof(node));

          if(!head)
          {
                printf("创建链表失败,请关闭程序,重新打开");
                getchar();
          exit(-1);
          }
      scanf("%d",&k);
          head->next->date = k;
          head->next->next = NULL;
      head = head->next;      
   }
   return(phead);
}

int empty_list(node *head)
{
        if(head == NULL)
        {
                return 1;
        }
        else
        {
          return 0;
        }
}

int treval_list(node *head)
{   
        int i;

    for(i=1;head->next!=NULL;i++)
        {
          printf("%d\t",head->next->date);
          printf("\n");
                head = head->next;
        }
        return 1;

}

int delete_list(node *head,int i,int n)
{   
    if(i<0||i>n)
        {
          printf("输入节点位置有误\n");
          return 0;
        }
        else
        {
          node *p = NULL;
          int j;

          for(j=1;j<i;j++)
          {
              head = head->next;
          }
      printf("您删除的节点为:%d",head->next->date);
      p = head->next;
      head->next = head->next->next;
      free(p);
      p = NULL;
      printf("\n");
          return 1;
        }
}

int add_list(node *head,int i,int k,int n)
{
    if(i<0||i>n)
        {
          printf("输入节点位置有误\n");
          return 0;
        }
        else
        {
          node *p = NULL;
          int j;
          
          for(j=1;j<i;j++)
          {
              head = head->next;
          }
          p = head;
          head = head->next;
          p->next = (node *)malloc(sizeof(node));
          p->next->next = head;
          p->next->date = k;
          return 1;
        }
}

Diu 发表于 2013-12-1 21:36:05

自己沙发,嘿嘿
页: [1]
查看完整版本: 今天写了个链表,供c语言初学者学习交流,大神勿喷,嘿嘿