单链表的定义
typedef struct LNode
{
struct LNode *next;
int data;
}LNode,*LinkList;
头插法建立链表(带头节点)
LinkList link_HeadInsert()
{
LinkList head=(LinkList)malloc(sizeof(LinkList));
head->next=NULL;
int data;
scanf("%d",&data);
while(data!=9999)
{
LNode *node=(LNode *)malloc(sizeof(LNode));
node->data=data;
node->next=head->next;
head->next=node;
scanf("%d",&data);
}
return head;
}
尾插法建立链表(带头节点)
LinkList link_TailInsert()
{
LinkList head=(LinkList)malloc(sizeof(LinkList));
head->next=NULL;
LNode *prenode=head;
int data;
scanf("%d",&data);
int i=0;
while(data!=9999)
{
LNode *node=(LNode *)malloc(sizeof(LNode));
node->data=data;
node->next=NULL;
if(i==0)
{
head->next=node;
}
else
{
prenode->next=node;
}
prenode=node;
scanf("%d",&data);
i++;
}
return head;
}
头插法建立链表(不带头节点)
LinkList link_HeadInsert_WithoutHead()
{
LinkList head=(LinkList)malloc(sizeof(LinkList));
int i=0;
int data;
scanf("%d",&data);
while(data!=9999)
{
LNode *node=(LNode *)malloc(sizeof(LNode));
node->data=data;
if(i==0)
{
node->next=NULL;
}
else
{
node->next=head;
}
head=node;
i++;
scanf("%d",&data);
}
return head;
}
按位序插入(带头节点)
Status linkListInsert(LinkList L,int i,int e)
{
int result=-1;
if(i<1)return result;
LNode *node=L;
int j=0;
while(node!=NULL&&j<i-1)
{
node=node->next;
j++;
}
if(node!=NULL)
{
LNode *newNode=(LNode *)malloc(sizeof(LNode));
newNode->data=e;
newNode->next=node->next;
node->next=newNode;
}
return result;
}
按位序插入(不带头节点)
LinkList linkListInsert_WithoutHead(LinkList &L,int i,int e)
{
if(i<1)return NULL;
if(i==1)
{
LNode *newNode=(LNode *)malloc(sizeof(LNode));
newNode->data=e;
newNode->next=L;
L=newNode;
}
else
{
LNode *node=L;
int j=1;
while(node!=NULL&&j<i-1)
{
node=node->next;
j++;
}
if(node!=NULL)
{
LNode *newNode=(LNode *)malloc(sizeof(LNode));
newNode->data=e;
newNode->next=node->next;
node->next=newNode;
}
}
return L;
}
指定节点的后插操作1
void InsertNextNode(LNode *p,int e)
{
LNode *newNode=(LNode *)malloc(sizeof(LNode));
if(newNode!=NULL)
{
newNode->data=e;
newNode->next=p->next;
p->next=newNode;
}
}
指定节点的后插操作2
void InsertNextNode(LinkList &L,int i,int e)
{
LNode *node=L;
int j=0;
while(node!=NULL&&j<i-1)
{
node=node->next;
}
if(node!=NULL)
{
InsertNextNode(node,e);
}
}
指定节点的前插操作(第一次没想到)
void InsertPriorNode(LNode *p,int e)
{
if(p!=NULL)
{
LNode *newNode=(LNode *)malloc(sizeof(LNode));
newNode->next=p->next;
p->next=newNode;
newNode->data=p->data;
p->data=e;
}
}
按位序删除元素
void linkListDelete(LinkList &L,int i,int &e)
{
if(i<0)return;
int j=0;
LNode *node=L;
while(node!=NULL&&j<i-1)
{
node=node->next;
j++;
}
if(node==NULL)return;
if(node->next==NULL) return;
if(node!=NULL)
{
LNode *p=node->next;
node->next=p->next;
e=p->data;
free(p);
}
}
删除指定节点(第一次没想到)
void DeleteNode(LNode *p)
{
if(p==NULL)return;
LNode *q=p->next;
p->data=q->data;
p->next=q->next;
free(q);
}
根据位序查找数值
int getElem(LinkList L,int i)
{
int result=-1;
if(i<1)return result;
LNode *node=L->next;
int j=0;
while(node!=NULL&&j<i-1)
{
node=node->next;
result=node->data;
j++;
}
return result;
}
打印(有头结点)
void printLinkList(LinkList L)
{
int i=1;
LNode *node=L->next;
while(node!=NULL)
{
printf("第%d位:%d\n",i,node->data);
node=node->next;
i++;
}
}
打印(没有头结点)
void printLinkList_WithoutHead(LinkList L)
{
int i=1;
LNode *node=L;
while(node!=NULL)
{
printf("第%d位:%d\n",i,node->data);
node=node->next;
i++;
}
}
测试方法
int main(int argc, char* argv[])
{
return 0;
}