数据结构之线性表链表

#include <stdio.h>
#include <stdlib.h>
 
typedef int ElemType;
 
typedef struct Node {
    ElemType data;               
    struct Node *next;          
}Node,*LinkedList;//Node可删除 
 
 

 
LinkedList LinkedListInit() {           //建立 
    Node *L;
    L = (Node *)malloc(sizeof(Node)); 
    if(L == NULL) { 
        printf("申请内存空间失败\n");
    }
    L->next = NULL;                  
     return L;
}
 
 

 
LinkedList LinkedListCreatH() {          //输入 
    Node *L;
    L = (Node *)malloc(sizeof(Node));   
    L->next = NULL;                     
     
    ElemType x;                         
    while(scanf("%d",&x) != EOF) {
        Node *p;
        p = (Node *)malloc(sizeof(Node));    
        p->data = x;                      
        p->next = L->next;                    
        L->next = p; 
    }
    return L; 

 

 

LinkedList LinkedListLocate(LinkedList L,ElemType x) {         //查找 
    Node *p;
     int i=1;
    p=L->next;
    while(p && p->data!=x)
    {
        p=p->next;
        i++;
    }
    printf("所在位置为:");
    printf("%d\n",i);
     
    return p;
    
}
/*    
LinkedList LinkedListInsert(LinkedList L,int i,ElemType x) {      //插入后插法 
    Node *pre;                     
    pre = L;
    int tempi = 0;
    for (tempi = 1; tempi < i; tempi++) {
        pre = pre->next;                  
    }
    Node *p;                                
    p = (Node *)malloc(sizeof(Node));
    p->data = x; 
    p->next = pre->next;
    pre->next = p;
     
    return L;                           
}  
 */
 LinkedList LinkedListInsert(LinkedList L,int i,ElemType x) {       //插入前插法 
    Node *pre;                     
    pre = L;
    int tempi = 0;
    for (tempi = 1; tempi <= i; tempi++) {
        pre = pre->next;                  
    }
    Node *p;                                
    p = (Node *)malloc(sizeof(Node));
    p->data = x; 
    p->next = pre->next;
    pre->next = p;
    ElemType t;
    t = pre->data;
    pre->data=p->data;
    p->data = t;
    return L;                           
}  
 
 

 
LinkedList LinkedListDelete(LinkedList L,ElemType x)              //删除 
{
    Node *p,*pre=L;                    
    p = L->next;   
    while(p->data != x) {               
        pre = p; 
        p = p->next;       
    } 
        pre->next = p->next;          
            free(p);
            return L;
    

 
 

int main() {
    LinkedList list,start;
     int i;
     ElemType x;
     printf("1. 建立\n");
     printf( "2. 输入\n");
     printf( "3. 查找\n");
     printf("4. 插入\n");
     printf( "5. 删除\n");
     printf( "0. 退出\n\n");
     int choose = -1;
    while (choose != 0) 
    {
        printf("请选择:");
        scanf("%d",&choose); 
           switch (choose) 
        {
            case 1: //建立一个单链表
                if (LinkedListInit())
                printf("成功建立链表!\n\n");
                break;
            case 2: //输入数据 
                    printf("请输入单链表的数据:"); 
                        list = LinkedListCreatH();
                    for(start = list->next; start != NULL; start = start->next) {
                    printf("%d ",start->data);
                    }
                    printf("成功输入数据!");
                    printf("\n");
                break;
            case 3: //单链表的查找
                printf("请输入要查找的元素的值:");
                scanf("%d",&x);
                LinkedListLocate(list,x);
                printf("\n");
                break;
            case 4: //单链表的插入
                printf("请输入插入数据的位置:");
                scanf("%d",&i);
                printf("请输入插入数据的值:");
                scanf("%d",&x);
                LinkedListInsert(list,i,x);
                for(start = list->next; start != NULL; start = start->next) {
                printf("%d ",start->data);
                }
                printf("\n");
                break;
            case 5: //单链表的删除
                printf("请输入要删除的元素的值:");
                scanf("%d",&x);
                   LinkedListDelete(list,x); 
                   printf("删除后的元素为:"); 
                   for(start = list->next; start != NULL; start = start->next) {
                printf("%d ",start->data);
                }
                printf("\n");
                break;
            case 0:
               exit(1);
               break; 
        
        }
           
    }
 /*   
     printf("请输入单链表的数据:"); 
    list = LinkedListCreatH();
    for(start = list->next; start != NULL; start = start->next) {
        printf("%d ",start->data);
    }
    printf("\n");
    int i;
    ElemType x;
    printf("请输入插入数据的位置:");
    scanf("%d",&i);
    printf("请输入插入数据的值:");
    scanf("%d",&x);
    LinkedListInsert(list,i,x);
    for(start = list->next; start != NULL; start = start->next) {
        printf("%d ",start->data);
    }
    printf("\n");
    printf("请输入要查找的元素的值:");
    scanf("%d",&x);
    LinkedListLocate(list,x);
    printf("\n");
    printf("请输入要删除的元素的值:");
    scanf("%d",&x);
    LinkedListDelete(list,x); 
    for(start = list->next; start != NULL; start = start->next) {
        printf("%d ",start->data);
    }
    printf("\n");
  */  
    
     
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流萤数点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值