|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
请问为什么会这样报错啊?
- #include <stdio.h>
- #include <stdlib.h>
- #define MaxSize 50
- typedef int ElemType; // 把int替换成了Elemtype
- typedef struct LinkList
- {
- ElemType elem; // 存储整形元素
- struct LinkList *next; // 指向直接后继元素的指针
- } LinkList; // 等同于用typedef把struct LinkList定义成Linklist就不需要再输入struct LinkList,可以直接输入LinkList
- void InitList(LinkList *L); // 初始化链表声明
- void CreateList(LinkList *L, ElemType a[], ElemType n); // 创建链表声明
- ElemType ListInsert(LinkList *L, ElemType i, ElemType e); // 链表插入声明
- ElemType ListDelete(LinkList *L, ElemType i); // 删除链表声明
- void printlist(LinkList *headpoint); // 打印输出表中元素
- int main(void)
- {
- LinkList head; // 头结点
- LinkList *headpoint = &head; // 指向头结点的指针(结构体变量并不指向结构体,所以需要声明结构体指针)
- ElemType elements[MaxSize], n = 0, insertposition1, insertvalue1, insertposition2, insertvalue2, delete1, delete2; //
- InitList(headpoint);
- printf("##创建链表##\n\n");
- printf("请输入链表中元素值,以空格分隔(如,从键盘上依次输入21 18 30 75 42 56):");
- for (int i = 0; i < MaxSize; i++)
- {
- scanf("%d", &elements[i]);
- n++;
- if (getchar() == '\n')
- {
- break;
- }
- }
- CreateList(headpoint, elements, n);
- printlist(headpoint); // 输出各元素的值
- putchar('\n');
- printf(
- "\n##插入操作##\n\n"
- "请输入第一次要插入的位置和插入的数值(插入位置和插入数值之间以空格相隔,如2 5,表示第2个位置插入数值5):");
- scanf("%d %d", &insertposition1, &insertvalue1);
- if (ListInsert(headpoint, insertposition1, insertvalue1))
- {
- printf("在第%d个位置插入%d成功\n", insertposition1, insertvalue1);
- }
- else
- {
- printf("在第%d个位置插入%d失败,插入位置不合法\n", insertposition1, insertvalue1);
- }
- printlist(headpoint);
- putchar('\n');
- printf(
- "请输入第二次要插入的位置和插入的数值(插入位置和插入数值之间以空格相隔,如2 5,表示第2个位置插入数值5):");
- scanf("%d %d", &insertposition2, &insertvalue2);
- if (ListInsert(headpoint, insertposition2, insertvalue2))
- {
- printf("在第%d个位置插入%d成功\n", insertposition2, insertvalue2);
- }
- else
- {
- printf("在第%d个位置插入%d失败,插入位置不合法\n", insertposition2, insertvalue2);
- }
- printlist(headpoint);
- putchar('\n');
- printf(
- "\n##删除操作##\n\n"
- "请输入第一次要删除元素的位置(如 2 表示删除第2个位置的数值):");
- scanf("%d", &delete1);
- if (ListDelete(headpoint, delete1))
- {
- printf("删除第%d个数据元素成功\n", delete1);
- }
- else
- {
- printf("删除第%d个数据元素失败,删除位置不合法\n", delete1);
- }
- printlist(headpoint);
- putchar('\n');
- printf(
- "\n请输入第二次要删除元素的位置(如 2 表示删除第2个位置的数值):");
- scanf("%d", &delete2);
- if (ListDelete(headpoint, delete2))
- {
- printf("删除第%d个数据元素成功\n", delete2);
- }
- else
- {
- printf("删除第%d个数据元素失败,删除位置不合法\n", delete2);
- }
- printlist(headpoint);
- putchar('\n');
- while (headpoint != NULL) // 为了防止内存泄漏,最后进行内存释放
- {
- LinkList *temp = headpoint;
- headpoint = headpoint->next;
- free(temp);
- }
- printf("\n=====顺序表初始化、插入,删除等操作已完成,程序结束!=====\n\n");
- system("pause");
- return 0;
- }
- void InitList(LinkList *L) /* 初始化链表 */
- {
- L = (struct LinkList *)malloc(sizeof(struct LinkList *));
- L->next = NULL;
- }
- void CreateList(LinkList *L, ElemType a[], int n) /*创建链表 */
- {
- LinkList *pre = L;
- int i;
- for (i = n - 1; i >= 0; i--)
- {
- LinkList *t = (struct LinkList *)malloc(sizeof(struct LinkList *));
- t->elem = a[i];
- t->next = NULL;
- pre->next = t;
- pre = pre->next;
- }
- }
- int ListInsert(LinkList *L, int i, ElemType e) /*按i位置插入元素*/
- {
- int j = 0;
- LinkList *p = L;
- while (p && (j < i - 1))
- {
- p = p->next;
- j++;
- }
- if (!p || (j > i - 1))
- return 0;
- LinkList *t = (struct LinkList *)malloc(sizeof(struct LinkList *));
- t->elem = e;
- t->next = p->next;
- p->next = t;
- return 1;
- }
- int ListDelete(LinkList *L, int i) /*删除某个位置的元素*/
- {
- int j = 0;
- LinkList *p = L;
- LinkList *del = NULL;
- while ((p->next) && (j < i - 1))
- {
- p = p->next;
- j++;
- }
- if (!(p->next) || (j > i - 1))
- {
- return 0;
- }
- del = p->next;
- p->next = del->next;
- free(del);
- return 1;
- }
- void printlist(LinkList *headpoint) // 打印输出表中元素
- {
- printf("\n当前表中元素如下\n");
- LinkList *p = headpoint->next;
- putchar('{');
- while (p != NULL)
- {
- printf("%d ", p->elem);
- p = p->next;
- }
- putchar('}');
- }
复制代码
我知道了。
请你看一下代码的第18行:
- LinkList *headpoint = &head;
复制代码
可以发现,这里的 headpoint 变量并不是用 malloc 动态申请的内存空间指针,而是一个静态的指针。所以是不能被 free 函数删除的。
所以只需删除 headpoint 指向的一系列动态内存空间即可。
修改后的代码(仅修改主函数最后几句)
- #include <stdio.h>
- #include <stdlib.h>
- #define MaxSize 50
- typedef int ElemType; // 把int替换成了Elemtype
- typedef struct LinkList
- {
- ElemType elem; // 存储整形元素
- struct LinkList *next; // 指向直接后继元素的指针
- } LinkList; // 等同于用typedef把struct LinkList定义成Linklist就不需要再输入struct LinkList,可以直接输入LinkList
- void InitList(LinkList *L); // 初始化链表声明
- void CreateList(LinkList *L, ElemType a[], ElemType n); // 创建链表声明
- ElemType ListInsert(LinkList *L, ElemType i, ElemType e); // 链表插入声明
- ElemType ListDelete(LinkList *L, ElemType i); // 删除链表声明
- void printlist(LinkList *headpoint); // 打印输出表中元素
- int main(void)
- {
- LinkList head; // 头结点
- LinkList *headpoint = &head; // 指向头结点的指针(结构体变量并不指向结构体,所以需要声明结构体指针)
- ElemType elements[MaxSize], n = 0, insertposition1, insertvalue1, insertposition2, insertvalue2, delete1, delete2; //
- InitList(headpoint);
- printf("##创建链表##\n\n");
- printf("请输入链表中元素值,以空格分隔(如,从键盘上依次输入21 18 30 75 42 56):");
- for (int i = 0; i < MaxSize; i++)
- {
- scanf("%d", &elements[i]);
- n++;
- if (getchar() == '\n')
- {
- break;
- }
- }
- CreateList(headpoint, elements, n);
- printlist(headpoint); // 输出各元素的值
- putchar('\n');
- printf(
- "\n##插入操作##\n\n"
- "请输入第一次要插入的位置和插入的数值(插入位置和插入数值之间以空格相隔,如2 5,表示第2个位置插入数值5):");
- scanf("%d %d", &insertposition1, &insertvalue1);
- if (ListInsert(headpoint, insertposition1, insertvalue1))
- {
- printf("在第%d个位置插入%d成功\n", insertposition1, insertvalue1);
- }
- else
- {
- printf("在第%d个位置插入%d失败,插入位置不合法\n", insertposition1, insertvalue1);
- }
- printlist(headpoint);
- putchar('\n');
- printf(
- "请输入第二次要插入的位置和插入的数值(插入位置和插入数值之间以空格相隔,如2 5,表示第2个位置插入数值5):");
- scanf("%d %d", &insertposition2, &insertvalue2);
- if (ListInsert(headpoint, insertposition2, insertvalue2))
- {
- printf("在第%d个位置插入%d成功\n", insertposition2, insertvalue2);
- }
- else
- {
- printf("在第%d个位置插入%d失败,插入位置不合法\n", insertposition2, insertvalue2);
- }
- printlist(headpoint);
- putchar('\n');
- printf(
- "\n##删除操作##\n\n"
- "请输入第一次要删除元素的位置(如 2 表示删除第2个位置的数值):");
- scanf("%d", &delete1);
- if (ListDelete(headpoint, delete1))
- {
- printf("删除第%d个数据元素成功\n", delete1);
- }
- else
- {
- printf("删除第%d个数据元素失败,删除位置不合法\n", delete1);
- }
- printlist(headpoint);
- putchar('\n');
- printf(
- "\n请输入第二次要删除元素的位置(如 2 表示删除第2个位置的数值):");
- scanf("%d", &delete2);
- if (ListDelete(headpoint, delete2))
- {
- printf("删除第%d个数据元素成功\n", delete2);
- }
- else
- {
- printf("删除第%d个数据元素失败,删除位置不合法\n", delete2);
- }
- printlist(headpoint);
- putchar('\n');
- headpoint=headpoint->next;
- while (headpoint != NULL) // 为了防止内存泄漏,最后进行内存释放
- {
- LinkList *temp = headpoint;
-
- headpoint = headpoint->next;
-
- free(temp);
-
- }
- printf("\n=====顺序表初始化、插入,删除等操作已完成,程序结束!=====\n\n");
- system("pause");
- return 0;
- }
- void InitList(LinkList *L) /* 初始化链表 */
- {
- L = (struct LinkList *)malloc(sizeof(struct LinkList *));
- L->next = NULL;
- }
- void CreateList(LinkList *L, ElemType a[], int n) /*创建链表 */
- {
- LinkList *pre = L;
- int i;
- for (i = n - 1; i >= 0; i--)
- {
- LinkList *t = (struct LinkList *)malloc(sizeof(struct LinkList *));
- t->elem = a[i];
- t->next = NULL;
- pre->next = t;
- pre = pre->next;
- }
- }
- int ListInsert(LinkList *L, int i, ElemType e) /*按i位置插入元素*/
- {
- int j = 0;
- LinkList *p = L;
- while (p && (j < i - 1))
- {
- p = p->next;
- j++;
- }
- if (!p || (j > i - 1))
- return 0;
- LinkList *t = (struct LinkList *)malloc(sizeof(struct LinkList *));
- t->elem = e;
- t->next = p->next;
- p->next = t;
- return 1;
- }
- int ListDelete(LinkList *L, int i) /*删除某个位置的元素*/
- {
- int j = 0;
- LinkList *p = L;
- LinkList *del = NULL;
- while ((p->next) && (j < i - 1))
- {
- p = p->next;
- j++;
- }
- if (!(p->next) || (j > i - 1))
- {
- return 0;
- }
- del = p->next;
- p->next = del->next;
- free(del);
- return 1;
- }
- void printlist(LinkList *headpoint) // 打印输出表中元素
- {
- printf("\n当前表中元素如下\n");
- LinkList *p = headpoint->next;
- putchar('{');
- while (p != NULL)
- {
- printf("%d ", p->elem);
- p = p->next;
- }
- putchar('}');
- }
复制代码
运行结果
- ##创建链表##
- 请输入链表中元素值,以空格分隔(如,从键盘上依次输入21 18 30 75 42 56):21 18 30 75 42 56
- 当前表中元素如下
- {56 42 75 30 18 21 }
- ##插入操作##
- 请输入第一次要插入的位置和插入的数值(插入位置和插入数值之间以空格相隔,如2 5,表示第2个位置插入数值5):2 2
- 在第2个位置插入2成功
- 当前表中元素如下
- {56 2 42 75 30 18 21 }
- 请输入第二次要插入的位置和插入的数值(插入位置和插入数值之间以空格相隔,如2 5,表示第2个位置插入数值5):5 5
- 在第5个位置插入5成功
- 当前表中元素如下
- {56 2 42 75 5 30 18 21 }
- ##删除操作##
- 请输入第一次要删除元素的位置(如 2 表示删除第2个位置的数值):2
- 删除第2个数据元素成功
- 当前表中元素如下
- {56 42 75 5 30 18 21 }
- 请输入第二次要删除元素的位置(如 2 表示删除第2个位置的数值):5
- 删除第5个数据元素成功
- 当前表中元素如下
- {56 42 75 5 18 21 }
- =====顺序表初始化、插入,删除等操作已完成,程序结束!=====
- 请按任意键继续. . .
复制代码
|
-
|