数据结构-线性表的链式存储
1. 在链表初始化和头插法时需要注意二级指针。具体可参考文章 https://www.cnblogs.com/WeyneChen/p/6672045.html
2. 在链表创建时,需要注意是不是带有头结点的链表
//线性表的链式存储 #include <stdio.h> #include <stdlib.h> #define MAXSIZE 101 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int Status; typedef int ElemType; typedef struct Node{ ElemType data; struct Node *next; }Node; typedef struct Node *LinkList; //用e返回L中第i个元素的值,假设有头结点 Status GetElem(LinkList L,int i,ElemType *e){ int j=1; LinkList p; p=L->next; while(p&&j<i){ p=p->next; ++j; } if(!p||j>i){ return ERROR; } *e= p->data; return OK; } //在L中第i个位置之前插入新的元素e Status ListInsert(LinkList L,int i,ElemType e){ int j=1; LinkList p,s; p=L->next; while(p&&j<i){ ++j; p=p->next; } if(!p||j>i){ return ERROR; } s=(LinkList)malloc(sizeof(Node)); s->data=e; s->next=p->next; p->next=s; return OK; } //删除L中第i个位置,返回元素e Status LinkListDelete(LinkList L,int i,ElemType *e){ int j=1; LinkList p,q; p=L; while(p->next&&j<i){ ++j; p=p->next; } if(!p||j>i){ return ERROR; } q=p->next;//第i个位置为p->next; p->next=q->next; free(q); return OK; } /*初始化链表,传的是二级指针,操作的是一级指针的地址*/ Status InitList(LinkList *L){ *L=(LinkList)malloc(sizeof(Node)); //这里的*L就是Node节点的指针对象 if(!(*L)) //申请内存失败 return ERROR; (*L)->next=NULL; return OK; } //建立单链表 初始化头插法 n,表示插入的个数 此链表有头结点 Status CreateListHead(LinkList *L,int n){ LinkList p; *L = (LinkList)malloc(sizeof(Node)); (*L)->next = NULL; for(int i=0;i<n;i++){ p=(LinkList)malloc(sizeof(Node)); p->data=i; p->next=(*L)->next; (*L)->next=p; } return OK; } //建立单链表 初始化尾查法 n,表示插入的个数 Status CreateListTail(LinkList *L,int n){ LinkList p,r; (*L)=(LinkList)malloc(sizeof(Node)); (*L)->next=NULL; r=(*L); for(int i=0;i<n;i++){ p=(LinkList)malloc(sizeof(Node)); p->data=i; r->next=p; r=p; } r->next=NULL; return OK; } //遍历单链表 Status TraverseList(LinkList L){ LinkList p; p=L->next; while(p){ printf("%d ",p->data); p=p->next; } return OK; } //清空单链表 Status ClearList(LinkList L){ LinkList p,q; p=L->next; while(p){ q=p->next; free(q); p=q; } L->next=NULL; } //主函数 int main(){ LinkList L1; //创建一个节点,用于头插法 LinkList L2; //创建一个节点,用于尾插法 printf("......头插法......\n"); InitList(&L1); //初始化 CreateListHead(&L1,5); LinkList p,p1; TraverseList(L1); printf("\n"); printf("......尾插法......\n"); InitList(&L2); //初始化 CreateListTail(&L2,5); TraverseList(L2); printf("\n"); //获取元素的值 ElemType e=0; GetElem(L2,1,&e); printf("%d \n",e); //删除一个指定位置的元素 printf("删除L1中2号元素:"); LinkListDelete(L1,2,&e); TraverseList(L1); printf("\n"); return 0; }