才学链表,抄了一个书上的,为什么一直跑不起啊,我用的vs2019
//C语言构建链表
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct stud_node {
int num;
char name[20];
int score;
struct stud_node* next;
};
struct stud_node* Create_Stu_Doc();//新建链表
struct stud_node* InsrtDoc(struct stud_node* head, struct stud_node* stud);//插入
struct stud_node* DeleteDoc(struct stud_node* head, int num);//删除
void Print_stu_Doc(struct stud_node* head);//遍历
int main()
{
struct stud_node* head, * p;
int choice, num, score;
char name[20];
head = NULL;
int size = sizeof(struct stud_node);
do {
printf("1:create 2:insert 3:delete 4:print 0:exit\n");
scanf_s("%d", &choice);
switch (choice) {
case 1:
head= Create_Stu_Doc();
break;
case 2:
printf("Input num,name and score:\n");
scanf_s("%d%s%d",&num,name,&score);
p = (struct stud_node*)malloc(size);
p->num = num;
strcpy_s(p->name, name);
p->score = score;
head = InsrtDoc(head, p);
break;
case 3:
printf("Input num:\n");
scanf_s("%d", &num);
head = DeleteDoc(head, num);
break;
case 4:
Print_stu_Doc(head);
break;
case 0:
break;
}
} while (choice != 0);
return 0;
}
//新建链表
struct stud_node* Create_Stu_Doc()
{
struct stud_node* head, * p;
int num, score;
char name[20];
int size = sizeof(struct stud_node);
head = NULL;
printf("Input num,name and score:\n");
scanf_s("%d%s%d",&num,name,&score);
while (num != 0)
{
p = (struct stud_node*)malloc(size);
p->num = num;
strcpy_s(p->name, name);
p->score = score;
head = InsrtDoc(head, p); //调用插入函数
scanf_s("%d%s%d", &num, name, &score);
}
return head;
}
//插入
struct stud_node* InsrtDoc(struct stud_node* head, struct stud_node* stud)
{
struct stud_node* ptr, * ptr1, * ptr2;
ptr2 = head;
ptr = stud;
if (head == NULL)
{
head = ptr;
head->next = NULL;
}
else{
while ((ptr->num > ptr2->num) && (ptr2->next != NULL)) {
ptr1 = ptr2;
ptr2 = ptr2->next;
}
if (ptr->num <= ptr2->num) {
if (head == ptr2) head = ptr;
else ptr1->next = ptr;
ptr->next = ptr2;
}
else {
ptr2->next = ptr;
这是后半截代码
ptr->next = NULL;
}
}
return head;
}
//删除
struct stud_node* DeleteDoc(struct stud_node* head, int num)
{
struct stud_node * ptr1, * ptr2;
while (head != NULL && head->num == num) {
ptr2 = head;
head = head->next;
free(ptr2);
}
if (head == NULL)
return NULL;
ptr1 = head;
ptr2 = head->next;
while (ptr2 != NULL) {
if (ptr2->num == num) {
ptr1->next = ptr2->next;
free(ptr2);
}
else
ptr1 = ptr2;
ptr2 = ptr1->next;
}
return head;
}
//遍历
void Print_stu_Doc(struct stud_node* head)
{
struct stud_node*ptr;
if (head == NULL)
{
printf("\nNo Records\n");
return;
}
printf("\nThe Students'Records Are:\n");
printf("num\tname\tscore\n");
for(ptr=head;ptr!=NULL;ptr=ptr->next)
printf(" %d\t%s\t%d\n",ptr->num, ptr->name, ptr->score);
}
整理修改如下,供参考:
//C语言构建链表
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct stud_node {
int num;
char name[20];
int score;
struct stud_node* next;
};
struct stud_node* Create_Stu_Doc();//新建链表
struct stud_node* InsrtDoc(struct stud_node* head, struct stud_node* stud);//插入
struct stud_node* DeleteDoc(struct stud_node* head, int num);//删除
void Print_stu_Doc(struct stud_node* head);//遍历
int main()
{
struct stud_node* head, * p;
int choice, num, score;
char name[20];
head = NULL;
int size = sizeof(struct stud_node);
do {
printf("1:create 2:insert 3:delete 4:print 0:exit\n");
scanf_s("%d", &choice);
switch (choice) {
case 1:
head = Create_Stu_Doc();
break;
case 2:
printf("Input num,name and score:\n");
scanf_s("%d%s%d", &num, name, 20, &score); //scanf_s("%d%s%d", &num, name, &score);
p = (struct stud_node*)malloc(sizeof(struct stud_node)); //p = (struct stud_node*)malloc(size);
p->num = num;
strcpy_s(p->name, name);
p->score = score;
head = InsrtDoc(head, p);
break;
case 3:
printf("Input num:\n");
scanf_s("%d", &num);
head = DeleteDoc(head, num);
break;
case 4:
Print_stu_Doc(head);
break;
case 0:
break;
}
} while (choice != 0);
return 0;
}
//新建链表
struct stud_node* Create_Stu_Doc()
{
struct stud_node* head, * p;
int num, score;
char name[20];
int size = sizeof(struct stud_node);
head = NULL;
printf("Input num,name and score:\n");
scanf_s("%d%s%d", &num, name, 20, &score); //scanf_s("%d%s%d", &num, name, &score);
while (num != 0)
{
p = (struct stud_node*)malloc(size);
p->num = num;
strcpy_s(p->name, name);
p->score = score;
head = InsrtDoc(head, p); //调用插入函数
scanf_s("%d%s%d", &num, name, 20, &score); //scanf_s("%d%s%d", &num, name, &score);
}
return head;
}
//插入
struct stud_node* InsrtDoc(struct stud_node* head, struct stud_node* stud)
{
struct stud_node* ptr, * ptr1, * ptr2;
ptr2 = head;
ptr = stud;
if (head == NULL)
{
head = ptr;
head->next = NULL;
}
else {
while ((ptr->num > ptr2->num) && (ptr2->next != NULL)) {
ptr1 = ptr2;
ptr2 = ptr2->next;
}
if (ptr->num <= ptr2->num) {
if (head == ptr2) head = ptr;
else ptr1->next = ptr;
ptr->next = ptr2;
}
else {
ptr2->next = ptr;
ptr->next = NULL;
}
}
return head;
}
//删除
struct stud_node* DeleteDoc(struct stud_node* head, int num)
{
struct stud_node* ptr1, * ptr2;
while (head != NULL && head->num == num) {
ptr2 = head;
head = head->next;
free(ptr2);
}
if (head == NULL)
return NULL;
ptr1 = head;
ptr2 = head->next;
while (ptr2 != NULL) {
if (ptr2->num == num) {
ptr1->next = ptr2->next;
free(ptr2);
}
else
ptr1 = ptr2;
ptr2 = ptr1->next;
}
return head;
}
//遍历
void Print_stu_Doc(struct stud_node* head)
{
struct stud_node* ptr;
if (head == NULL)
{
printf("\nNo Records\n");
return;
}
printf("\nThe Students'Records Are:\n");
printf("num\tname\tscore\n");
for (ptr = head; ptr != NULL; ptr = ptr->next)
printf(" %d\t%s\t%d\n", ptr->num, ptr->name, ptr->score);
}