参加了这么多次面试,如果考数据结构的话,觉得最容易考的就是单链表与排序了,当然好像栈也考的多,今天先看看单链表。多亏去年看严蔚敏的数据结构很是下了功夫,所以数据结构现在还是蛮有信心的。
单链表
//线性表的单链表存储结构
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//从表尾到表头逆向建立单链表的算法,O(n)
void CreateList_L(LinkList &L,int n)
{
//逆位序输入n个元素的值,建立带表头结点的单链线性表L
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;//先建立一个带头结点的单链表
for(i=n;i>0;--i)
{
p=(LinkList)malloc(sizeof(LNode));//生成新结点
scanf(&p->data);//输入元素值
p->next=L->next;
L->next=p;//插入到表头
}
}
//查找
Status GetElem_L(LinkList L,int i,ElemType &e)
{
//L为带头结点的单链表的头指针
//当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
p=L->next;
j=1;//初始化,p指向第一个结点,j为计数器
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p||j>i)
return ERROR;//第i个元素不存在
e=p->data;
return OK;
}
//插入
Status ListInsert_L(LinkList &L,int i,ElemType e)
{
//在带头结点的单链线性表L中第i个位置之前插入元素e
p=L;
j=0;
while(p&&j<i-1)
{
p=p->next;
++j;
}//寻找第i-1个结点
if(!p||j>i-1)
return ERROR;//i大于1或者大于表长加1
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
//删除
Status ListDelete_L(LinkList &L,ElemType &e)
{
//在带头结点的单链线性表中,删除第i个元素,并由e返回其值
p=L;
j=0;
while(p->next&&j<i-1)
{
//寻找第i个结点,并令p指向其前趋
p=p->next;
++j;
}
if(!(p->next)||j>i-1)
return ERROR;//删除位置不合理
q=p->next;
p->next=q->next;//删除并释放结点
e=q->data;
free(q);
return OK;
}
//归并
void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc)
{
//已知单链线性表La和Lb的元素按值非递减排序
//归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列
pa=La->next;
pb=Lb->next;
Lc=pc=La;//用La的头结点作为Lc的头结点
while(pa&&pb)
{
if(pa->data<=pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else
{
pa->next=pb;
pc=pb;
pb=pb->next;
}
}
pc->next=pa?pa:pb;//插入剩余段
free(Lb);//释放Lb的头结点
}
今天先写这样一段单链表。
本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/crescent_star/archive/2009/03/21/4011718.aspx