C语言实现链表 - c语言程序开发技术文章 - 红黑联盟
http://www.2cto.com/kf/201109/104029.html
C代码 /* * @author: lizhenbin * @date: 2011-09-14 * @descrption: list operation */ #include <stdio.h> #include <stdlib.h> #include <conio.h> #define NULL 0 /* define a link node strut */ struct student { long num; struct student *prior; /* define point to the struct */ struct student *next; }; /* create struct */ struct student *create() { struct student *head; /* link head and node point */ struct student *p; struct student *q; long x; head = (struct student*)malloc(sizeof(struct student)); q = head; head->next = NULL; printf("\nPlease input node numbers to the list: \n"); scanf("%ld",&x); while(x!=0) { /* create node */ p = (struct student*)malloc(sizeof(struct student)); p->num = x; p->next = NULL; q->next = p; p->prior = q; q = p; scanf("%ld",&x); } return head; } /* Output list all datas */ void print(struct student *head) { struct student *p; p = head->next; printf("\nThe list is: "); if(p==NULL) { printf("\nInput list is NULL!"); } while(p!=NULL) { printf("%ld ", p->num); p = p->next; } printf("\n"); } /* delete list node */ void del(struct student *head) { struct student *p; struct student *q; int i; int j=0; printf("Please input delete position: "); scanf("%d", &i); if(i<1) { printf("You input %d error.", i); printf("\nTry again, Input nnum: "); scanf("%d", &i); } p = head; while(j<=i-1 && p!=NULL) { p = p->next; j++; } if(p==NULL) { printf("\nThere is no %d in the list.", i); exit(1); } else { /* delete list node */ q = p; p->prior->next = p->next; p->next->prior = p->prior; p = p->next; free(q); } } /* insert list node */ void insert(struct student *head) { struct student *p; struct student *q = head; int i; int j = 0; p = (struct student*)malloc(sizeof(struct student)); printf("\nPlease input the student No you want to insert: "); scanf("%ld", &p->num); printf("\nInput the student %d position to insert: ",p->num); scanf("%d", &i); if(i<1) { printf("\nYou input %d error.", i); printf("\nTry again, Input nnum: "); scanf("%d", &i); } while(j<=i-1 && q->next!=NULL) { q = q->next; j++; } if(q->next==NULL && j!=i) { p->next = NULL; p->prior = q; q->next = p; } else { q->prior->next = p; p->prior = q->prior; p->next = q; q->prior = q; } } /* search list node position and data */ void search(struct student *head) { struct student *p; long number, i=1, j=0; printf("\nPlease input the index you want to search: "); scanf("%d", &number); p = head->next; printf("\nThe number in the list position is: "); while(p!=NULL) { if(p->num==number) { printf("%d\n",i); j = 1; } p = p->next; i++; } if(j==0) { printf("There is no %ld in the list.\n",number); } } /* read data from file input */ struct student *filein() { struct student *p1; struct student *p2; struct student *head; int i = 0; FILE *fp; char file[20] = "d:/list/node.txt"; printf("\nFileName is: %s\n", file); if((fp=fopen(file, "r"))==NULL) { printf("Can not open file: %s", file); exit(0); } p2 = (struct student*)malloc(sizeof(*p1)); head = p2; p1 = (struct student*)malloc(sizeof(*p1)); while(fread(p1, sizeof(*p1), 1, fp)==1) { i++; p2->next = p1; p2 = p1; p1->next = NULL; p1 = (struct student*)malloc(sizeof(*p1)); } free(p1); fclose(fp); if(i==0) { printf("\nNo recored in %s ", file); } return head; } /* save the list result to file */ void savefile(struct student* head) { struct student *p1; FILE *fp; char file[20] = "d:/list/node.txt"; printf("\nFileName: %s", file); printf("\nPlease wait.../n"); if((fp=fopen(file,"w"))==NULL) { printf("\nCan not open file: %s", file); exit(0); } p1 = head->next; while(p1!=NULL) { fwrite(p1, sizeof(struct student), 1, fp); p1 = p1->next; } fclose(fp); } /* print the operate menu */ void showMenu() { printf("|-------------------------------------------------|\n"); printf("| Link List Opearte Menu |\n"); printf("|-------------------------------------------------|\n"); printf("| 1: Insert |\n"); printf("| 2: Delete |\n"); printf("| 3: Search |\n"); printf("| 4: FileIn |\n"); printf("| 5: Savefile |\n"); printf("| 6: Print List |\n"); printf("| 7: Print Menu |\n"); printf("| 8: Exit |\n"); printf("|-------------------------------------------------|\n"); } /* main funtion */ void main() { int a=0; struct student *la; la = create(); /* la = (struct student*)malloc(sizeof(struct student)); la->next = NULL; */ while(1) { showMenu(); scanf("\n%d", &a); switch(a) { case 1: insert(la); break; case 2: del(la); break; case 3: search(la); break; case 4: filein(); break; case 5: savefile(la); break; case 6: print(la); break; case 7: showMenu(); break; case 8: exit(1); default: printf("\nInput error,Try again.");break; } } } 作者“萧萧易水寒”