这个运行结果答案部分正确,还有什么错误的地方或者遗漏的条件吗?
#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;
}