写了两天,终于将线性表链式存储调通了,代码奉上:
#include <stdio.h> #include <stdlib.h> //定义链表存放的数据类型 typedef int Eletype; //定义组成链表的结构体 typedef struct Node{ Eletype data; struct Node *next; }Node; //定义链表的头指针 typedef Node *LinkList; //链表的常用操作方法:初始化、清空、检测链表是否为空、插入、删除 LinkList init(){ //定义头指针、要插入的结构体 LinkList l,s; //定义指针类型的结构体 l=(LinkList)malloc(sizeof(Node)); //让链表最后一个节点的指针为空,也可以让他指向自己(循环链表) l->next=NULL; //循环生成要插入的数据 for(int i=1;i<6;i++){ //创建要插入的指针类型的结构体 s=(LinkList)malloc(sizeof(Node)); //给结构体赋值 s->data=i; //把头指针的next给新生成的结构体 s->next=l->next; //再让头指针指向该结构体,这样新生成的结构体一直就在前面 l->next=s; } } void ClearAll(LinkList *l){ //定义两个指针类型的结构体 LinkList p,q; //让p指向链表的第一个数据 p=(*l)->next; //当第一个数据不为空 while(p){ //把p的next给q,再把p释放掉,再把q给p,这样是为了把链表所有数据都释放掉而不是只释放第一个数据,把后边的落下 q=p->next; free(p); p=q; } //把所有数据释放后,最后再让头指针指向空 (*l)->next=NULL; } int isEmpty(LinkList l){ if(l->next!=NULL){ return 1; }else{ return 0; } } void getEle(LinkList l,Eletype *e,int index){ LinkList p; int i=1; //让p指向链表第一个数据 p=l->next; //当p存在并且要取的数据不是第一个时,就让p往下指 while(p&&i<index){ p=p->next; i++; } *e=p->data; } void display(LinkList l,int length){ Eletype e; printf("链表中的数据:\n"); for(int i=1;i<length;i++){ getEle(l,&e,i); printf("%d ",e); } printf("\n"); } void insertEle(LinkList *l,Eletype ele,int index){ LinkList p,s; int i=1; //定义一个指针指向头指针,比如想要在第一个位置插入,就要拿到第一个位置前面的节点。 //经过循环拿到要插入的位置前面的节点p p=*l; while(p&&i<index){ p=p->next; i++; } //创建节点给他赋值 s=(LinkList)malloc(sizeof(Node)); s->data=ele; //把新节点插进去 s->next=p->next; p->next=s; } void deleteEle(LinkList *l,Eletype *e,int index){ LinkList p,s; int i=1; //定义一个指针指向头指针 p=*l; //当它存在第一个数据并且要删除的节点不是第一个就循环往下指 while(p->next&&i<index){ p=p->next; i++; } //p是要删除的节点前面的节点,拿到要删除的节点s,把的s的next给p的next,再给s释放掉 s=p->next; *e=s->data; p->next=s->next; free(s); } int main() { printf("Hello world!\n"); LinkList ll; Eletype s=100,e=6; ll=init(); printf("链表是否为空:%d\n",isEmpty(ll)); display(ll,6); insertEle(&ll,e,1); display(ll,7); deleteEle(&ll,&s,1); display(ll,6); printf("删除的数据:%d\n",s); ClearAll(&ll); printf("链表是否为空:%d\n",isEmpty(ll)); return 0; }