/*-----------------------------------------------------*/ /*--------------单链表的创建、插入、删除、倒置操作-----------*/ /*--------------Written by redfire250-----2005.5.10----*/ /*-----------------------------------------------------*/
#include<malloc.h> #include<stdio.h> #define null 0 struct student { long Number; char Name[20]; long Score; struct student *Next; };
int n=0;/*n为全局变量,用来计算链表的结点个数*/
/*-----------------------------------------*/ /*--------------创建结点函数Creat()--------*/ /*-----------------------------------------*/ struct student *Creat() {
struct student *p1; struct student *p2; struct student *head=null; p1=p2=(struct student *)malloc(sizeof(struct student));/*开辟一段可用内存单元*/ printf("please input the student's Number Name and the Score:n"); scanf("%ld%s%ld",&p2->Number,p2->Name,&p2->Score);
while(p2->Number!=0) { n++;
if(n==1) /*是否开辟的是第一个结点*/ head=p2; else p1->Next=p2;
p1=p2; p2=(struct student *)malloc(sizeof(struct student)); printf("Input the Number the Name and the Score:n"); scanf("%ld%s%ld",&p2->Score); } p1->Next=null; return(head); }
/*------------------------------------------*/ /*--------------查看链表内容函数View()------*/ /*------------------------------------------*/ View(struct student *head) { struct student *p; p=head; while(p->Next!=null) { printf("%ld %s %ldn",p->Number,p->Name,p->Score); p=p->Next; } printf("%ld %s %ldn",p->Score); }
/*-------------------------------------------------*/ /*--------------插入结点函数(前插)Insert()-------*/ /*-------------------------------------------------*/ Insert(struct student *head,int Num) /*head为链表头指针,Num插入链表位置*/ { int t=1; struct student *p1,*p2; p1=head; if (Num>n||Num<0) { printf("input error!!!n"); return 0; } while(t<Num-1) /*找到要插入结点的前一个结点*/ { p1=p1->Next; t++; } p2=(struct student *)malloc(sizeof(struct student)); printf("Input the Number the Name and the Score:n"); scanf("%ld%s%ld",&p2->Score); p2->Next=p1->Next; p1->Next=p2; n++;
}
/*------------------------------------------*/ /*------------ 删除结点函数Delnode()--------*/ /*-----------------------------------------*/ Delnode(struct student *head,int node) { int t=1; struct student *p1,*p2; p2=head; if (node>n||node<1) { printf("error!!! The node is not exist!"); return 0; } while(t<node-1) /*找到要删除结点的前一个结点*/ { p2=p2->Next; t++; } p1=p2->Next->Next; /*找到要删除结点的后一个结点*/ free(p2->Next); /*释放要删除的结点空间(删除)*/ p2->Next=p1; /*前一结点指向后一结点*/ n--; }
/*-------------------------------------------------*/ /*--------------逆序重组链表Invert()-------*/ /*-------------------------------------------------*/ struct student *Invert(struct student *head) { struct student *p1,*p2; p1=head; p2=p1->Next; head=p2->Next; p1->Next=null; while(head->Next!=null) { p2->Next=p1; p1=p2; p2=head; head=head->Next; } head->Next=p2; p2->Next=p1; return head; }
main() { int number1,number2; struct student *head; head=Creat(); View(head);
printf("the n that you want to insert:n"); scanf("%d",&number1); Insert(head,number1); View(head);
printf("the node that you want to DELETE:n"); scanf("%d",&number2); Delnode(head,number2); View(head); printf("Inverte the list:n"); View(Invert(head)); getch(); }
详细请参考:http://www.codesky.net/article/200503/59538.html (编辑:安卓应用网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|