c/c++数据结构单链表基本操作

这个运行结果答案部分正确,还有什么错误的地方或者遗漏的条件吗?

img

img

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

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

node* head = NULL;
int size = 0;
void insertD(int k, int d) {
node* p = (node*)malloc(sizeof(node));
p->data = d;
p->next = NULL;
if (k == 0) {
if(size == 0){
head = (node*)malloc(sizeof(node));
head->data = d;
head->next = NULL;
}
else{
p->next = head;
head = p;
}
}
else
{
if (k > size) return;
node* q = head;
for (int i = 1; i < k; ++i) {
q = q->next;
}
node* t = q->next;
q->next = p;
p->next = t;
}
size++;
}
void deletD(int k) {
if (k == 1) {
if(size < 1) return;
node* p = head;
head = head->next;
free(p);
}
else {
if (k > size || k == 0) return;
node* p = head;
for (int i = 1; i < k - 1; ++i) {
p = p->next;
}
node* q = p->next;
p->next = q->next;
free(q);
}
size--;
if(size == 0){
head = NULL;
}
}
void printD() {
if(!head) return;
node* p = head;
while (p) {
printf("%d ", p->data);
p = p->next;
}

}

int inputD(char* str, int i) {
int b = 0;
while (str[i] != '\0') {
b = b * 10 + str[i] - '0';
i++;
}
if(b>=0&&b<100000)
return b;
}

int* inputN(char* str, int n) {
int str1 = 0;
int temp = 0;
int zz = 0;
int* num = (int*)malloc(sizeof(int) * n);
while (str[str1] != '\0')
{
if (str[str1] == ' ') {
num[zz] = temp;
temp = 0;
zz++;
str1++;
continue;
}
temp = temp * 10 + str[str1] - '0';
str1++;
}
num[zz] = temp;
return num;
}

int main() {
char str[100000];
int n = 0;
gets(str);
n = inputD(str, 0);
gets(str);
int* num = inputN(str, n);
head = (node*)malloc(sizeof(node));
node* root = head;
for (int i = 0; i < n; ++i) {
node* p = (node*)malloc(sizeof(node));
p->data = num[i];
p->next = NULL;
root->next = p;
root = root->next;
size++;
}
head = head->next;

int m;
gets(str);
m = inputD(str, 0);

while (m--) {
    gets(str);
    if (str[0] == '0') {
        int* num3 = inputN(str, 3);
        insertD(num3[1], num3[2]);
    }
    else {
        int* num2 = inputN(str, 2);
        deletD(num2[1]);
    }
}
printD();
return 0;

}

主函数里,读入命令的部分写的太复杂了。提供一种写法,供参考:

#include <stdio.h>
#include <stdlib.h>
typedef struct _node {
    int  data;
    struct _node* next;
}node, * pnode;

void createlist(pnode* head, int n)
{
    int i;
    pnode pt = NULL, tail = NULL;
    for (i = 0; i < n; i++) {
        pt = (pnode)malloc(sizeof(node));
        pt->next = NULL;
        scanf("%d", &pt->data);
        if ((*head) == NULL)
            (*head) = pt;
        else
            tail->next = pt;
        tail = pt;
    }
}

void insertnode(pnode* head, int d, int k)
{
    int i = 0;
    pnode pt = NULL, pre = NULL, p = (*head);
    if (k < 0) return;   //插入时,k = 0 合法
    while (p && i < k) {
        i++;
        pre = p;
        p = p->next;
    }
    if (!p && i < k)  return; //插入时,插入位置超过链表长度非法,忽略
    pt= (pnode)malloc(sizeof(node));
    pt->next = NULL;
    pt->data = d;
    if (k == 0) {
        pt->next = (*head);
        (*head) = pt;
    }
    else {
        pt->next = pre->next;
        pre->next = pt;
    }
}

void delnode(pnode* head, int k)
{
    int i = 0;
    pnode pre = NULL, p = (*head);
    if (k <= 0) return;   //删除时,删除第0个结点,非法,忽略
    while (p && i < k - 1) {
        i++;
        pre = p;
        p = p->next;
    }
    if (!p && i < k)  return;//删除位置超过链表长度,非法,忽略
    if (p == (*head)) {
        pre = (*head);
        (*head) = (*head)->next;
        free(pre);
    }
    else{
        pre->next = p->next;
        free(p);
    }
}

void print(pnode head)
{
    pnode p = head;
    while (p) {
        printf(p == head ? "%d" : " %d", p->data);
        p = p->next;
    }
}
int main()
{
    pnode head = NULL;
    int n, m, s, k, d;
    scanf("%d", &n);
    createlist(&head, n);
    scanf("%d", &m);
    while (m--) {
        scanf("%d", &s);
        switch (s) {
        case 0:scanf("%d%d", &k, &d);
               insertnode(&head, d, k);
               break;
        case 1:scanf("%d", &k);
               delnode(&head, k);
               break;
        default:break;
        }
    }
    print(head);
    return 0;
}