单链表的操作
以一种更好理解的方式编写代码
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
//定义单链表
typedef struct node
{
ElemType elem;
struct node *next;
}Node;
typedef struct singleList
{
Node *first;
int n;
}SingleList;
//初始化
int Init(SingleList *L)
{
L->first = NULL;
L->n = 0;
return 1;
}
//查找
int Find(SingleList L,int i,ElemType *x)
{
Node *p;
int j;
if(i<0 || i> L.n-1)
return 0;
p = L.first;
for(j=0;j<i;j++)
p = p->next;
*x = p->elem;
return 1;
}
//插入
int Insert(SingleList *L,int i,ElemType x)
{
Node *p,*q;
int j;
if(i<-1 || i>L->n-1)
return 0;
p = L->first;
for(j=0;j<i;j++)
p = p->next;
//生成新结点
q = (Node*)malloc(sizeof(Node));
q->elem = x;
if(i>-1)
{
q->next = p->next;
p->next = q;
}
else
{
q->next = L->first;
L->first = q;
}
L->n++;
return 1;
}
//删除操作
int Delete(SingleList *L,int i)
{
Node *p,*q;
int j;
if(i<0 || i>L->n-1)
return 0;
if(!L->n)
return 0;
p = L->first;
q = L->first;
for(j=0;j<i-1;j++)
{
q = q->next;
}
if(i == 0)
L->first = L->first->next;
else
{
p = q->next; //p指向ai
q->next = p->next;
}
free(p);
L->n--;
return 1;
}
//输出
int Output(SingleList *L)
{
Node *p;
if(!L->n)
return 0;
p = L->first;
while(p)
{
printf("%d ",p->elem);
p = p->next;
}
printf("\n");
return 1;
}
//单链表的撤销
void Destory(SingleList *L)
{
Node *p;
while(L->first)
{
p = L->first->next;
free(L->first);
L->first = p;
}
}
int main(void)
{
int i,x;
SingleList list;
printf("执行链表的初始化的操作:\n");
Init(&list);
printf("执行链表的插入元素操作:\n");
for(i=0;i<10;i++)
{
Insert(&list,i-1,i);
}
Output(&list);
Find(list,1,&x);
printf("执行链表的查找元素操作:查找下标为1的元素:%d\n",x);
printf("执行链表的删除元素操作:删除下标为2的元素:\n");
Delete(&list,2);
Output(&list);
Destory(&list);
return 0;
}