objective-c 结构体单链表的实现,创建插入删除功能

//
//  main.m
//  test
//
//  Created by Roeru on 18/6/14.
//  Copyright (c) 2014年 Roeru. All rights reserved.
//

#import <Foundation/Foundation.h>


struct Node
{
    char name[20];
    int score;
    struct Node *next;
};

typedef struct Node ListNode;


//创建和输入链表
ListNode *CreateList(int n)
{
    ListNode *head;                                      //指向头结点指针
    ListNode *p = NULL;                                  //定义一个空的用来插入的指针
    ListNode *pre;                                       //用来移动的指针
    
    
    head = (ListNode *)malloc(sizeof(ListNode));         //给头文件分配内存
    (*head).next = NULL;                                 //头文件的next指针赋值空
    pre = head;                                          //让移动的指针等于头指针
    int i;                                               //用来写循环判断输入元素个数
    for(i = 1;i <= n;i++)
    {
        NSLog(@"input name of the %d student:",i);
        p = (ListNode *)malloc(sizeof(ListNode));
        scanf("%s",&(*p).name);
        NSLog(@"input score of the %d student:",i);
        scanf("%d",&(*p).score);
        (*pre).next = p;                                //将现在pre里next指针指向p
        pre = p;                                        //可以理解为pre指针移动到p
    }
    (*p).next  = NULL;
    return head;
}


//输出链表
void putList(ListNode *h)
{
    ListNode *p;
    p = (*h).next;                                          //将p指针指向头指针
    while(p)
    {
        NSLog (@"%s,%d",(*p).name,(*p).score);
        p = (*p).next;
        NSLog (@"\n");
    }
}



//插入链表的实现
void insertList(ListNode *h,int i,char name[],int score,int n)
{
    ListNode *p,*q;                                      //先定义2个指向一个节点的指针
    int j;
    if (1 > i || n+1 < i) {
        NSLog(@"Error!please enter again");
    }
    j = 0;
    p = h;
    while(j<i-1)                                         //这一步在做移动指针
    {                                                    //因为要在位置前面所以减1
        p = (*p).next;
        j++;
    }
    q = (ListNode *)malloc(sizeof(ListNode));
    strcpy((*q).name,name);                              //将name复制到(*q).name里
    (*q).score = score;
    (*q).next = (*p).next;                               //新插入的next等于原下一跳指向
    (*p).next = q;                                       //原节点next指针指向插入节点
    
}


//删除链表的实现
void deleteList(ListNode *h,int i,int n)
{
    ListNode *p,*q;
    int j;
    if (1>i || n<i) {
        NSLog(@"Error!please enter again");
    }
    j = 0 ;
    p = h ;
    while (j != i) {
        p = (*p).next;
        j++;
    }
    q = (*p).next;
    (*p).next = (*q).next;
    free(q);
}


int main()
{
    ListNode *h;                    //h指向结构体Node
    int i = 1, n, score;
    char name [10];
    
    while ( i )
    {
        /*输入提示信息*/
        NSLog(@"1--set a new list\n");
        NSLog(@"2--add a new element\n");
        NSLog(@"3--delect a element\n");
        NSLog(@"4--put out the list\n");
        NSLog(@"0--exit\n");
        
        scanf("%d",&i);
        switch(i)
        {
            case 1:
                NSLog (@"n=");   /*输入创建链表结点的个数*/
                scanf("%d",&n);
                h=CreateList(n);/*创建链表*/
                NSLog(@"list elements is : \n");
                putList(h);
                break;
                
            case 2:
                NSLog(@"input the position. of insert element:");
                scanf("%d",&i);
                NSLog(@"input name of the student:");
                scanf("%s",name);
                NSLog(@"input score of the student:");
                scanf("%d",&score);
                insertList(h,i,name,score,n);
                break;
                
            case 3:
                NSLog(@"input the position of delete element:");
                scanf("%d",&i);
                deleteList(h,i,n);
                NSLog(@"list elements in : \n");
                putList(h);
                break;
                
                
            case 4:
                NSLog(@"list element is : \n");
                putList(h);
                break;
            case 0:
                return 0;
                break;
            default:
                NSLog(@"ERROR!Try again!\n");
        }
    }
}

自己是刚刚学习代码的小白(C语言才看了1天书)所以肯定会有很多问题,请大家谅解

目前在执行方面,这个代码没什么问题,不过bug肯定很多。

你可能感兴趣的:(objective-c 结构体单链表的实现,创建插入删除功能)