c数据结构之单链表操作

来源:互联网 发布:淘宝排名下降怎么补救 编辑:程序博客网 时间:2024/06/05 06:19
#include<stdio.h>
#include<stdlib.h>


typedef struct Node{
       int data;
       struct Node *next;       
}Linklist;




void createLink(Linklist *h){
    Linklist  *p1, *p;
    p1 = p = h;
    int linkLength;
    printf("请输入链表的长度:  ");
    scanf("%d", &linkLength);
    int i;
    for(i = 0;i < linkLength; i ++){
           printf("请输入链表的第%d结点的值:  ", i + 1);
           scanf("%d", &p->data);
            //p->data = 2 + i;
            p = (Linklist *)malloc(sizeof(Linklist));
            p1->next = p;
            p1 = p;
    }
    p1->next = NULL;
}


void insertNodeByIndex(Linklist * list){
    int index;
    printf("请输入要插入的位置下标:  ");
    scanf("%d", &index);
    int i ;
    for(i = 0; i < index - 2; i ++){
          list = list->next;
    }
    Linklist  *p;
    p = (Linklist *)malloc(sizeof(Linklist));
    printf("请输入要插入的值:  ");
    scanf("%d", &p->data);
    p->next = list->next;
    list->next = p;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
}


void deleteNodeByIndex(Linklist * list){
     int index;
     printf("请输入要删除的位置下标:  ");
     scanf("%d", &index);
     int i;
     for(i = 0; i < index - 2; i ++ ){
             list = list->next;
     } 
     list->next = list->next->next;
}




void printLink(Linklist *list){
     while(list->next !=  NULL){
                  printf("%d\t", list->data);
                  list = list->next;
    }
    printf("\n");
}




void sortLink(Linklist *list){
     int count = getLinkLength(list);
     if(count == 0){
              printf("没有结点");
     }else if(count == 2){
           if(list->data > list->next->data){
                         list->next->next = list;
                         list->next = NULL;
           }
     }else if(count > 2){
           int i;
           for(i = 0; i < count - 1; i ++){
                 if(list->data > list->next->data){//如果前面大于后面 
                      list->next = list->next->next;
                      list->next = list;  
                 }
           }
     }
     
}


int getLinkLength(Linklist *list){
    int count = 0;
    while(list->next !=  NULL){            
        count ++; 
        list = list->next;
    }
    printf("链表的长度为: %d \n",count); 
    return count;
}


int main(){
    Linklist *list;
    list = (Linklist *)malloc(sizeof(Linklist));
    int index;
    while(index != 0){
                 printf("\n 1 建立链表 \n 2 插入结点 \n 3 删除结点 \n 4 排序链表 \n 5 打印链表\n 6 打印长度 \n 请输入选项:  ");
                 scanf("%d", &index); 
                 switch(index){
                      case 1 :    createLink(list); break;
                      case 2 :    insertNodeByIndex(list); break;
                      case 3 :    deleteNodeByIndex(list); break;
                      case 4 :    sortLink(list); break;  
                      case 5 :    printLink(list); break;
                      case 6 :    getLinkLength(list); break; 
                 }
    }
    system("pause");
    return 0;
}