6-7 单链表操作集(不带有空头结点) (12 分)

 

本题要求实现不带有空头结点(dummy head node)的单链表操作集。

函数接口定义:

struct Node* findByIndex(struct Node *head, int index);
int insertByIndex(struct Node **phead, int index, int item);
int deleteByIndex(struct Node **phead, int index, int *pitem);

其中链表结构定义如下:

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

设链表结点从1开始顺序编号,各函数阐述如下:
struct Node* findByIndex(struct Node *head, int index) 查找序号为index的结点,若找到则返回结点地址,否则返回NULL
int insertByIndex(struct Node **phead, int index, int item) 将元素item插入到链表中且成为序号为index的结点,若插入成功则返回1,否则返回0
int deleteByIndex(struct Node **phead, int index, int *pitem) 将链表中序号为index的结点删除并将其值放到pitem指向的变量中,若删除成功则返回1,否则返回0

裁判测试程序样例:

/* 测试程序仅为示例,实际的测试程序可能不同 */
#include <stdio.h>
#include <stdlib.h>
struct Node{
    int data;
    struct Node *next;
};
struct Node* initList() { return NULL; }
void printList(struct Node* head){
    /* 细节省略 */
}
struct Node* createNode(int data){
    struct Node *p;
    p = (struct Node*)malloc(sizeof(struct Node));
    if(!p) return NULL;
    p->data = data;
    p->next = NULL;
    return p;
};

struct Node* findByIndex(struct Node *head, int index);
int insertByIndex(struct Node **phead, int index, int item);
int deleteByIndex(struct Node **phead, int index, int *pitem);

int main(){
    struct Node *head;
    head = initList();
    int op, r, index, item;
    struct Node *p;
    scanf("%d", &op);
    while(op){  //1:查找   2:插入 3:删除     其它:退出
        switch(op){
        case 1:
            scanf("%d", &index);
            p = findByIndex(head, index);
            printf("%d\n", p ? p->data : 99999);
            break;
        case 2:
            scanf("%d%d", &index, &item);
            r = insertByIndex(&head, index, item);
            printf("%d : ", r);
            printList(head);
            break;
        case 3:
            scanf("%d", &index);
            item = 99999;
            r = deleteByIndex(&head, index, &item);
            printf("%d %d : ",r,item);
            printList(head);
            break;
        default:
            return 0;
        }
        scanf("%d", &op);
    }
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

2 1 10
2 1 20
2 2 30
2 4 5
2 6 6
1 2
1 5
3 1
3 2
0

结尾无空行

输出样例:

1 : 10, 
1 : 20, 10, 
1 : 20, 30, 10, 
1 : 20, 30, 10, 5, 
0 : 20, 30, 10, 5, 
30
99999
1 20 : 30, 10, 5, 
1 10 : 30, 5, 

结尾无空行