#include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<assert.h> typedef struct node { int data; struct node *next; }NODE,HEAD,*PNODE,*LINKLIST; //初始化链表 void init(LINKLIST *list) { *list = (LINKLIST)malloc(sizeof(HEAD)); (*list)->next=NULL; } //向链表添加数据 void add(LINKLIST list,int data) { PNODE p = list ,q; if(!p) return; //将p指向list的最后一个 while(p->next) p=p->next; q = (PNODE)malloc(sizeof(NODE)); q->data = data; q->next = NULL; p->next = q; } //第i个位置 插入数据 i>=1 void insert(LINKLIST list,int i,int data) { int j; PNODE p=list,q; //将 p 指向 list的第 i-1 个位置 for(j=1;j<i && p;j++) { p = p->next; } if(!p || i<1) return ; q = (PNODE) malloc(sizeof(NODE)); q->data =data; q->next = p->next; p->next = q; } //删除第i个位置的数据 i>=1,并将删除的数据保存在data中 void del(LINKLIST list,int i,int *data) { int j; PNODE p=list,q; //将 p 指向 list的第 i-1 个位置 for(j=1;j<i && p;j++) { p = p->next; } if(!p || i<1) return ; q = p->next;//q为要删除的节点 *data = q->data; p->next = q->next; free(q); } //清除list void clear(LINKLIST list) { PNODE p=list,q=p->next; if(!p) return; while(p=q) { q=p->next; free(p); } list->next=NULL; } //销毁list void destroy(LINKLIST list) { PNODE p=list,q; while(p) { q = p->next; free(p); p = q; } } //获取list中的第i个元素 i>=1 int getData(LINKLIST list,int i) { PNODE p=list; assert(i>=1 && p);//为p断言,防止list不存在或者i的位置不合法 while(i-- && p) p=p->next; assert(p);//为p和i断言,防止位置i不在list的范围内 return p->data; } //获取链表的长度 int getLen(LINKLIST list) { PNODE p=list; int i=0; if(!p) return i; while(p->next) { i++; p=p->next; } return i; } //显示 void display(LINKLIST list) { PNODE p=list; if(!p) return ; while(p= p->next) printf("%d ",p->data); printf(" "); } int main() { int i; LINKLIST list; init(&list); for(i=1;i<=10;i++) add(list,i); display(list); printf("%d ",getData(list,1)); destroy(list);//销毁 system("pause"); return 0; }
总结:
插入操作:
1,将指针P指向插入位置前一个。
2,insertNode->next = P->next。
3,P->next = insertNode
删除操作:
1,将指针P指向删除节点delNode的前一个
2,delNode = p->next
3,p->next = delNode->next
4,free(delNode)