// lx.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<dos.h>
#include <conio.h>
#include<string.h>
#define total(p) (p->data.maths)+(p->data.chinese)+(p->data.english)
#define FALSE 0
#define TRUE 1
struct Info
{
char name[15];/*姓名*/
float maths;
float chinese;
float english;
};
typedef int BOOL;
typedef struct node/*定義通訊錄鏈表的結點結構*/
{
struct Info data;
struct node *next;
}Node,*link;
void enter(link l)/*輸入記錄*/
{
Node *p,*q;
q=l;
p=(Node*)malloc(sizeof(Node));/*申請結點空間*/
if(!p)/*未申請成功輸出提示資訊*/
{
printf("memory malloc fail\n");
return;
}
printf("輸入姓名:");
scanf("%s",p->data.name);
printf("輸入數學成績:");
scanf("%f",&p->data.maths);
printf("輸入語文成績:");
scanf("%f",&p->data.chinese);
printf("輸入英語成績:");
scanf("%f",&p->data.english);
p->next=NULL;
q->next=p;
q=p;
}
void del(link l)
{
Node *p,*q;
char s[20];
q=l;
p=q->next;
printf("enter name:");
scanf("%s",s);/*輸入要洗掉的姓名*/
while(p)
{
if(strcmp(s,p->data.name)==0)/*查找記錄中與輸入名字匹配的記錄*/
{
q->next=p->next;/*洗掉p結點*/
free(p);/*將p結點空間釋放*/
printf("delete successfully!");
break;
}
else
{
q=p;
p=q->next;
}
}
getch();
}
void display(Node *p)
{
printf("\t%15s",p->data.name);
printf("\t%5.2f",p->data.maths);
printf("\t%5.2f",p->data.chinese);
printf("\t%5.2f",p->data.english);
printf("\t%5.2f",total(p));
}
void search(link l)
{
char name[20];
Node *p;
p=l->next;
printf("enter name to find:");
scanf("%s",name);/*輸入要查找的名字*/
while(p)
{
if(strcmp(p->data.name,name)==0)/*查找與輸入的名字相匹配的記錄*/
{
display(p);/*呼叫函式顯示資訊*/
getch();
break;
}
else
p=p->next;
}
}
void modify(link l)
{
char name[20];
Node *p;
p=l->next;
BOOL find=FALSE;
printf("enter name to find:");
scanf("%s",name);/*輸入要查找的名字*/
while(p)
{
if(strcmp(p->data.name,name)==0)/*查找與輸入的名字相匹配的記錄*/
{
find=TRUE;
display(p);/*呼叫函式顯示資訊*/
printf("\n");
printf("輸入新的姓名:");
scanf("%s",p->data.name);
printf("輸入新的數學成績:");
scanf("%f",&p->data.maths);
printf("輸入新的語文成績:");
scanf("%f",&p->data.chinese);
printf("輸入英語成績:");
scanf("%f",&p->data.english);
break;
}
else
p=p->next;
}
if(find==FALSE)
{
printf("no found\n");
getch();
}
}
void list(link l)
{
Node *p;
p=l->next;
printf("\t\t\t姓名");
printf("\t數學");
printf("\t語文");
printf("\t英語");
printf("\t總分");
printf("\n");
while(p!=NULL)/*從首節點一直遍歷到鏈表最后*/
{
display(p);
printf("\n");
p=p->next;
}
getch();
}
void save(link l)
{
Node *p;
FILE *fp;
p=l->next;
if((fp=fopen("f:\\adresslist","wb"))==NULL)
{
printf("can not open file\n");
exit(1);
}
printf("\nSaving file\n");
while(p)/*將節點內容逐個寫入磁盤檔案中*/
{
fwrite(p,sizeof(Node),1,fp);
p=p->next;
}
fclose(fp);
getch();
}
void load(link l)
{
Node *p,*r;
FILE *fp;
l->next=NULL;
r=l;
if((fp=fopen("f:\\adresslist","rb"))==NULL)
{
printf("can not open file\n");
exit(1);
};
printf("\nLoading file\n");
while(!feof(fp))
{
p=(Node*)malloc(sizeof(Node));/*申請節點空間*/
if(!p)
{
printf("memory malloc fail!");
return;
}
if(fread(p,sizeof(Node),1,fp)!=1)/*讀記錄到節點p中*/
break;
else
{
p->next=NULL;
r->next=p;/*插入鏈表中*/
r=p;
}
}
fclose(fp);
getch();
}
int menu_select()
{
int i;
printf("\n\n\t *************************ADDRESS LIST*************************\n");
printf("\t|* 1.input record *|\n");
printf("\t|* 2.delete record *|\n");
printf("\t|* 3.list record *|\n");
printf("\t|* 4.search record *|\n");
printf("\t|* 5.save record *|\n");
printf("\t|* 6.load record *|\n");
printf("\t|* 7.modi record *|\n");
printf("\t|* 8.Quit *|\n");
printf("\t **************************************************************\n");
do
{
printf("\n\tEnter your choice:");
scanf("%d",&i);
}while(i<0||i>8);
return i;
}
main()
{
link l;
l=(Node*)malloc(sizeof(Node));
if(!l)
{
printf("\n allocate memory failure "); /*如沒有申請到,輸出提示資訊*/
return 0; /*回傳主界面*/
}
l->next=NULL;
system("cls");
while(1)
{
system("cls");
switch(menu_select())
{
case 1:
enter(l);
break;
case 2:
del(l);
break;
case 3:
list(l);
break;
case 4:
search(l);
break;
case 5:
save(l);
break;
case 6:
load(l);
break;
case 7:
modify(l);
break;
case 8:
exit(0);
}
}
}
這是完整的代碼,我不太懂這個結構是怎么樣的。還有就是“輸入記錄”里的p->next=NULL;
q->next=p;
q=p; 這個代碼不太懂。就是p與q的關系和應用不能理解。
uj5u.com熱心網友回復:
這三行就是添加到鏈表里面uj5u.com熱心網友回復:
p->next=NULL;q->next=p;
q=p;
這幾句的意思是把新的結點p接到鏈表q的尾部,因為單鏈表的尾必須指向空,所以新加入的結點的next必須指向NULL。
uj5u.com熱心網友回復:
好的,有點理解了。很感謝。
uj5u.com熱心網友回復:
還有就是洗掉函式里面的q=p;
p=q->next;
不太能理解。
uj5u.com熱心網友回復:
這個說起來不容易說清楚,自己畫個圖就能明白了
uj5u.com熱心網友回復:
你這是洗掉的else就是當當前節點不是你要洗掉的資料時,借用個q等于p節點,然后p再指向q的下一個節點,這里兩個的作用是等同于p=p->next,但是這樣是有問題的,就借用q來轉一下
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/32523.html
標籤:C語言
上一篇:求助 C語言 鏈表洗掉重復節點
