本文作者:longlongago 博客地址:
http://blog.csdn.net/longlongago2000
本例有助于理解C指针和单链表的思想。
先说说指针的基本概念。
假设定义int a=100;地址分配为1010;
设定义LinkList H;指针变量;H指向结构体LNode,假设其初始化分配的空间地址为1001,其值为1010。再定义指向结构体指针H的指针,LinkList *L;假设其初始化分配的空间地址为1001;
变量 | 内存地址 | 值 | 说明 |
H | 1001 | 1010 | 这时获取H的值将是1010 |
... | ... | ... | .... |
*L | 1005 | 1001 | 获取*L的值将是1001,而**L的值将是1010 |
... | ... | ... | |
a | 1010 | 100 | &a为1010, a为100 |
#include"stdio.h"
#define OK 1
#define FALSE -1
#define OVERFLOW -1
typedef int ElemType;
typedef int Status;
typedef struct{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
Status InitList(LinkList *L){
*L=(LinkList)malloc(sizeof(LNode));//L为指向结构体指针L的值(*L)->data=NULL;
(*L)->next=NULL;
return OK;
}
Status InsertList(LinkList L,ElemType e){
LinkList p;
LinkList s;
if(!L)return FALSE;
p=L;
if(p->data==NULL){
p->data=e;
return OK;
}
while(p->next!=NULL)
p=p->next;
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=NULL;
p->next=s;
return OK;
}
Status PrintList(LinkList L){
LinkList p;
p=L;
if(L){
printf("x=%d/n",p->data);
PrintList(p->next);
}
return OK;
}
Status DelList(LinkList L,int i,ElemType *e){
LinkList p,s;
int j=0;
p=L;
while(p->next && j<i-2){
p=p->next;
++j;
}
if(!(p->next) || j>i-2)return FALSE;
s=p->next;
p->next=s->next;
*e=s->data;free(s);
}
void main(){
int e;
LinkList H;//H只是指针存储的指向的地址,不是*H
InitList(&H);
InsertList(H,1);
InsertList(H,2);
InsertList(H,3);
InsertList(H,4);
InsertList(H,5);
InsertList(H,6);
InsertList(H,7);
InsertList(H,8);
InsertList(H,9);
InsertList(H,0);
DelList(H,5,&e);
PrintList(H);
printf("%d/n",e);
}
希望对大家有帮助,有问题可以提出.