链表有一个特性,可以拥有不连续的内存空间,但是它有一个头指针,指针指向头结点,从头结点开始后面的所有结点,都由一个数据域和地址域构成,NO pictue you say a J8。
这就是一条链表,错误的是最后的结点没有指向NULL,别问我图哪里来的,盗图从来不需解释~
链表中的结点,需要存两种信息,一种是数据,例如说成绩、座位号、名字,而另一个信息就是下一个结点的地址,看代码。
#include这只是个人写的代码,没有进行优化,主要是时间比较少,抱歉!#include #include #define EOF -1 #define LEN sizeof(struct data) typedef struct data listlink; int n; //优化链表,存储链表结点数 struct data { int num; float score; struct data *next; }; listlink *Clist() { listlink *head = NULL; listlink *p1,*p2; p1 = p2 = (listlink *)malloc(LEN); if(!p1) //检测内存分配结果 { return EOF; } printf("请输入座号:"); scanf("%d",&p1->num); printf("请输入成绩:"); scanf("%f",&p1->score); n = 0; //全局变量,链表结点数量 while( p1->num ) { n++; if(n == 1) { head = p1; } else { p2->next = p1; } p2 = p1; p1 = (listlink *)malloc(LEN); printf("请输入座号:"); scanf("%d",&p1->num); printf("请输入成绩:"); scanf("%f",&p1->score); } p2->next = NULL; return head; } void Plist(listlink *L) { listlink *p; p = L; if(L) { do { printf("number:%d score:%f\n",p->num,p->score); p = p->next; }while(p); } } listlink *Dlist(listlink *L) { int x; listlink *p1,*p2; if(L == NULL) { printf("空表,木有结点数据\n"); goto END; } printf("\n请输入想要删除的结点(座号):"); scanf("%d",&x); p1 = L; while( p1->num != x && p1->next != NULL) //便利所有结点 { p2 = p1; p1 = p1->next; } if(p1->num == x) { if(p1 == L) //头结点 { L = p1->next; } else { p2->next = p1->next; } printf("删除完毕!\n"); n -= 1; } else { printf("表中没有该结点数据\n"); } END:return L; } listlink *Nlist(listlink *L) { listlink *p1,*p2,*p3; int x,i; do { p1 = (listlink *)malloc(LEN); //动态分配新内存 }while(!p1); printf("\n请输入结点数据(座号,成绩):"); //接收结点数据 do { scanf("%d %f",&p1->num,&p1->score); }while(p1->num == 0); if(L == NULL) //检测空表 { printf("空表,直接插入\n"); L = p1; goto END; } printf("请输入结点插入位置:"); scanf("%d",&x); //接收结点位置 while(x > n+1 || x <= 0) //检测插入位置 { printf("插入位置有误,请重新输入:"); scanf("%d",&x); } printf("\n插入位置正确!\n"); p2 = L; if(x == 1) //插入位置为头结点 { p1->next = L; L = p1; } else if(x == n+1) //插入位置在最后 { while(p2->next != NULL) { p2 = p2->next; } p2->next = p1; p1->next = NULL; } else { for(i = 1;i next; } p3 = p2; p3 = p3->next; p2->next = p1; p1->next = p3; } END:printf("插入操作结束!\n"); n += 1; return L; } int main() { listlink *L; system("color 0A"); printf("创建链表\n"); loop:L = Clist(); if(L == EOF) { printf("\n内存分配出错,重新创建操作···\n"); goto loop; } printf("\n该链表一共有%d个结点\n\n",n); Plist(L); L = Dlist(L); Plist(L); L = Nlist(L); Plist(L); system("pause"); }