单链表
链表中的每个结点只有一个指针域,我们将这种链表称为单链表。
头指针(head):指向链表第一个结点。
最后一个结点指针域为空。
结点可以连续存储,也可以不连续存储.
结点的逻辑顺序与物理顺序可以不一致.
//单链表的存储结构描述
typedef struct Node // 结点类型定义
{
//ElemType 具体类型据实际设定, 如int,char等
ElemType data;
struct Node * next;
}Node, *LinkList;//LinkList为结构指针类型
//初始化单链表
InitList(LinkList *L)
{
*L = (LinkList)malloc(sizeof(Node));
(*L)->next=NULL;
}
//头插法
void CreateFromHead(LinkList L)
{
Node *s;
int flag=1;//标志--初值为1,当输入‘$’时,flag为0,建表结束
while(flag)
{ c=getchar();//接收一字符
if(c!=’$’) //如果字符不是‘$’,则执行头插
{
s=(Node *)malloc(sizeof(Node));
s->data=c;
s->next=L->next;
L->next=s;
} else
flag=0;
}
}
//尾插法
void CreateFromTail(LinkList L)
{
Node *r, *s;
int flag=1;//标志--初值为1,当输入“$”时,flag为0,建表结束
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;
}
}
}
//单链表插入操作
void InsList(LinkList L,int i,ElemType e)/*在带头结点的单链表L中第i个结点之前插入值为e的新结点。 */
{
Node *pre,*s;
int k;
if(i<1) return Error;
pre=L; k=0;
while(pre!=NULL&&k<i-1)
{ pre=pre->next; k=k+1; }
if(!pre)
{ printf(“插入位置不合理!”); return Error; }
s=(Node*)malloc(sizeof(Node)); //为e申请一个新的结点
s->data=e; /*将待插入结点的值e赋给s的数据域*/
s->next=pre->next;
pre->next=s;
return OK;
}
//单链表删除
void 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; }
if( !(pre->next) )
{
printf(“删除结点的位置i不合理!”);
return ERROR;
}
r=pre->next;
pre->next=pre->next->next /*删除结点r*/
e = r->data;
free(r); return OK;
}
//按序号查找
Node * Get(LinkList L, int i)/*在带头结点的单链表L中第i个结点之前插入值为e的新结点。 */
{
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; / * 找到了第i个结点 * /
else return NULL; / * 找不到,i>n * /
}
//按值查找
Node *Locate( LinkList L,ElemType key)/ * 在带头结点的单链表L中查找其结点值等于key的结点,若找到则返回该结点的位置p,否则返回NULL * /
{ Node *p;
p=L->next; / * 从表中第一个结点比较 * /
while (p!=NULL)
if (p->data!=key)
p=p->next;
else
break; / * 找到结点key,退出循环 * /
return p;
}
//单链表的长度
int ListLength(LinkList L) /*L为带头结点的单链表*/
{
Node *p;
p=L->next;
j=0; /*用来存放单链表的长度*/
while(p!=NULL)
{ p=p->next;
j ++;
}
return j;
}