修改处见注释,供参考:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>
struct linknode* head = NULL;//全局变量
struct linknode
{
int data;
struct linknode* next;
};
struct linknode* creat()//创建链表
{
int a;
struct linknode* head, * New, * p; //修改
head = (struct linknode*)malloc(sizeof(struct linknode));
if (head != NULL)
{
printf("申请内存成功:\n");
printf("请输入数据:"); scanf("%d", &head->data);
head->next = NULL;
p = head;
}
else
{
printf("申请内存失败\n"); return 0;
}
printf("是否继续创建新的节点(输入1:继续 或者0:放弃):");
scanf("%d", &a);
while (a)
{
New = (struct linknode*)malloc(sizeof(struct linknode));
if (New != NULL)
{
printf("申请内存成功:\n");
printf("请输入数据:"); scanf("%d", &New->data);
New->next = NULL;
p->next = New;
p = New;
}
else
{
printf("申请内存失败\n"); return 0;
}
printf("是否继续创建新的节点(输入1:继续 或者0:放弃):");
scanf("%d", &a);
}
return (head);
}
void printl(struct linknode* head)//输出链表内容
{
int j = 1;
struct linknode* p;
p = head;
while (p != NULL)
{
printf("第%d列", j);
printf("%d\n", p->data);
p = p->next;
j++;
}
}
int jshu(struct linknode* head)//算有多少个表(求表长)
{
int j = 0;
struct linknode* p;
p = head;
while (p != NULL)
{
p = p->next;
j++;
}
return j;
}
void insert(struct linknode* head)//插入链表
{
struct linknode* p, * New; //修改
if (head == NULL) return; //修改
p = head;
int a, i;
printf("选择要插入的列(放在该列的后面):");
scanf("%d", &a);
for (i = 0; i < a - 1; i++)
{
p = p->next;
}
New = (struct linknode*)malloc(sizeof(struct linknode));
if (New != NULL)
{
printf("申请内存成功:\n");
printf("请输入数据:"); scanf("%d", &New->data);
New->next = p->next;
p->next = New;
}
else
{
printf("申请内存失败\n");
return; //0; 修改
}
}
struct linknode* Delete(struct linknode* head)//删除链表 修改
{
struct linknode* p, * p1; //* new,修改
if (head == NULL) return NULL; //修改
p = head; p1 = head->next;
int a, i, zda;
zda = jshu(head);
p = head;
do { // 修改
printf("请选择要删除第几列(1 - %d):", zda);
scanf("%d", &a);
} while (a <= 0 || a > zda);
if (a == 1)
{
p = head;
head = p1;
free(p);
return (head);
}
else
{
for (i = 0; i < a - 2; i++)
{
p = p->next;
p1 = p1->next;
}
p->next = p1->next;
free(p1);
}
return (head);
}
void seek(struct linknode* head)//按照位置查找
{
struct linknode* p, * p1; //* new,修改
int a, i, zda;
zda = jshu(head);
if (head == NULL) return;
p = head; //p1 = head->next; 修改
printf("现在一共有%d列\n", zda);
do { // 修改
printf("请输入要查找第几列(1 - %d):",zda);
scanf("%d", &a);
} while (a <= 0 || a > zda);
if (a == 1)
{
printf("第1列的数据为:");
printf("%d\n", p->data);
}
else
{
for (i = 1; i < a; i++)
{
p = p->next;
//p1 = p1->next; 修改
}
printf("第%d列的数据为:", i);
printf("%d\n", p->data);
}
}
void seekdata(struct linknode* head)//按照元素查找
{
struct linknode* p, * p1;
int a, shu = 1; // i, b; 修改
if (head == NULL) return; // 修改
p = head; // p1 = head->next; 修改
printf("请输入要查找数据元素:");
scanf("%d", &a);
while (p != NULL && p->data != a) // 修改
{
p = p->next;
//p1 = p1->next; 修改
shu++;
}
if (p != NULL)//(p->data == a) 修改
{
printf("找到了\n");
printf("该数据元素在第%d列,", shu);
printf("数据为%d\n", p->data);
return; //0; 修改
}
else
{
printf("该单链表没有%d数据元素\n", a);/*################################*/
return; //0; 修改
}
}
void menu()//菜单
{
int a, bc; // k; 修改
mark:printf(" 单链表子系统 \n");
printf("======================================\n");
printf("| 1--建立链表 |\n");
printf("| 2--插入链表 |\n");
printf("| 3--删除链表 |\n");
printf("| 4--按位置查找 |\n");
printf("| 5--按元素值查找 |\n");
printf("| 6--求表长 |\n");
printf("| 0--返回 |\n");
printf("======================================\n");
printf("请输入菜单号(0-6)\n");
scanf("%d", &a);
switch (a)
{
case 0:printf("已经结束单链表子系统 "); return; //0; 修改
case 1:head = creat(); menu(); break;
case 2:printl(head); insert(head); printl(head); menu(); break;
case 3:printl(head); head = Delete(head); printl(head); menu(); break; //修改
case 4:seek(head); menu(); break;
case 5:seekdata(head); menu(); break;
case 6: bc = jshu(head); printf("表的长度为%d\n", bc); menu(); break;
default:printf("选择错误请重新选择:"); goto mark;
}
}
int main()
{
menu();
return 0;
}