一、单链表的存储结构
typedef struct Node
{
ElemType data;
struct Node* next;
}Node,*LinkList;
说明:LinkList 与Node * 是等价的
例如 LinkList L 意思是 L为单链表的头指针
例如Node *p 意思是 p是指向单链表中节点的指针变量
二、单链表的基本运算
1.初始化单链表
InitList(LinkList *L)
{
*L=(LinkList)malloc(sizeof(Node)); //建立头结点
(*L)->next=NULL; //建立空的单链表L
}
说明:L是指向单链表头结点的指针
*L相当于主程序中待初始化的头指针变量
2.头插法建立单链表
//用末尾插法建立单链表
void CreateFromHea(LinkList L)
{
Node *s;
int flag=1;
char c;
while(flag)
{
c=getchar();
if(c!='$')
{
s=(Node*)malloc(sizeof(Node));
s->data=c;
s->next=L->next;
L->next=s;
}
else flag=0;
}
}
3.用尾插法建立单链表
//用末尾插法建立单链表
void CreateFromTail(LinkList L)
{
Node *r,*s;
int flag=1;
r=L;
while(flag)
{
c=getchar();
if(c!='$')
{
s=(Node *)malloc(sizeof(Node));
s->data=c;
r->next=s;
r=s;
}
else
{
flag=0;
r->next=NULL; //将最后一个节点的next链域设成空,表示链表的结束
}
}
}
三、在单链表中查找
1.在单链表L查找第i个节点
Node* Get(LinkList L,int i)
{
int j;
Node *p;
if(i<=0) return(NULL);
p=L;j=0;
while((p->next!=NULL)&&(j<i))
{
p=p->next;
j++;
}
if(i==j) return p;
else return(NULL);
}
2.在单链表中查找 值为key的节点
Node* Locate(LinkList L,ElemType key)
{
Node *p;
p=L->next;
while(p!=NULL)
if(p->data!=key)
p=p->next;
else break;
return p;
}
3.求单链表的长度操作
int ListLength(LinkList L)
{
Node *p;
p=L->next;
j=0;
while(p!=NULL)
{
p=p->next;
j++;
}
return j;
}
4.单链表的插入操作
void InsList(LinkLit L,int i,ElemType e)
{
Node *pre,*s;
int k;
if(i<=0) return ERROR;
pre=L; k=0;
while(pre!=NULL&&k<i-1)
{
pre=pre->next;
k=k+1;
}//查找i-1个节点
if(pre==NULL)
{
printf("插入位置不合理");
return ERROR;
}
s=(Node*)malloc(sizeof(Node));
s->data=e;
s->next=pre->next;
pre->next=s;
return OK;
}
5.单链表的删除
int DelList(LinkList L,int i,ElemType *e)
{
Node *pre,*r;
int k;
pre=L; k=0;
while(pre->next!=NULL&&k<i-1)
{
pre=pre->next;
k=k+1;
}//查找第i-1个节点
if(pre->next==NULL)
{
printf("删除节点位置不合理");
return ERROR;
}
r=pre->next;
pre->next=r->next;//修改指针,删除节点r
*e=r->data;
free(r);
return OK;
}
6.单链表的合并操作
LinkList merge(LinkList LA,LinkList LB)
{
Node *pa,*pb;
LinkList LC;
pa=LA->next;
pb=LB->next;
LC=LA;
LC->next=NULL;
r=LC;
while(pa!=NULL&&pb!=NULL)
{
if(pa->data=pb->data)
{r->next=pa;r=pa;pa=pa->next}
else
{r-next=pb;r=pb;pb=pb->next}
}
if(pa)
r-next=pa;
else
r-next=pb;
free(LB);
return LC;
}
今日所想:用一年学会说话,却用一辈子学会沉默。
沉默的看这个世界,无论好坏,与世无争。
只愿沉默啊,保持内心的单纯与平静。
纵万般无奈也要不放在眼里,才是内心的安宁。