链表的操作(c实现)

typedef int ElemType; //使用typedef和define是一种很好的新馆
typedef int Status;

#define ERR_OK 0
#define ERR_NO 1

 

typedef struct Node{
ElemType data;//数据域
struct Node* next; //指针域
}Node;

 

typedef struct Node* LinkList;

 

//获取指定项的数据

Status GetElem(LinkList L,int index,ElemType *e)
{
int j;
LinkList p; //声明节点

p=L->next; //首先指向有效的数据节点
j=1;

//循环查找index的位置
while( p!=NULL && j<index)
{
p=p->next;
j++;
}

//判断当前节点的值是否是有效的值
if(p == NULL ||j>index)
{
return ERR_NO;
}

//获取节点的值
*e = p->data;

return ERR_OK;
}

//链表的插入
Status ListInsert(LinkList *L,int i,ElemType e)
{
int j;
LinkList p,s;
p=*L;
j=1;
while(p && j<i)
{
p=p->next;
j++;
}

if(!p && j>i)
{
return ERR_NO;
}

s= (LinkList)malloc(sizeof(Node)); //生成新节点

s->data = e;
s->next=p->next;//后继给后继
p->next=s; //上一个节点的next指向插入点

return ERR_OK;
}

//创建链表,头插法
void CreateListHead(LinkList* L,int n)
{
LinkList p;
int i;
srand(time(0));

*L = (LinkList)malloc(sizeof(Node));

(*L)->data = 0;
(*L)->next = NULL; //头节点的单链表

for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(Node));//生成新节点
p->data = rand()%100+1; //随机生成100以内的数字
p->next = (*L)->next; //之前
(*L)->next = p;
}
}

//创建线性表,尾插法
void CreateListTail(LinkList* L,int n)
{
LinkList p,r;
int i;
srand(time(0));

*L = (LinkList)malloc(sizeof(Node));
(*L) ->data=0;
(*L)->next = NULL; //头节点的单链表

r=*L; //尾节点指针初始化指向头节点

for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(Node));//生成新节点
p->data = rand()%100+1; //随机生成100以内的数字
r->next=p;
r = p;
}

r->next = NULL;
}

 

void main(void) //测试没有写标准的main函数写法
{
LinkList linklist;

CreateListTail(&linklist,5);

ListInsert(&linklist,3,2);

getchar();
}

 

vs中的结果

 

posted @ 2018-12-28 19:00  竹引  阅读(242)  评论(0编辑  收藏  举报