吃玉米的猫 2022-09-07 22:39 采纳率: 100%
浏览 56
已结题

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;

}

  • 写回答

2条回答 默认 最新

  • qzjhjxj 2022-09-08 02:37
    关注

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

    #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;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月16日
  • 已采纳回答 9月8日
  • 修改了问题 9月7日
  • 修改了问题 9月7日
  • 展开全部

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。