数据结构-单链表的系列操作
1、头文件
#ifndef LINKLISTHEAD_H_INCLUDED
#define LINKLISTHEAD_H_INCLUDED
#include<stdio.h>
#include<malloc.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
bool InitList1(LinkList &L);
bool Empty1(LinkList L);
LinkList list_HeadInsert(LinkList &L,int x);
LinkList list_HeadInsertS(LinkList &L);
bool ListInsert(LinkList &L,int i,int x);
bool InsertNextNode(LNode *p,int x);
bool InsertPriorNode(LNode *p,int x);
bool ListInsertTail(LinkList &L,int x);
bool ListDelete(LinkList &L,int i);
bool DeleteNode(LNode *p);
void PrintList(LinkList L);
LNode* GetNode(LinkList L);
LNode *GetElem(LinkList L,int i);
LNode *LocateElem(LinkList L,int x);
bool InitList2(LinkList &L);
bool Empty2(LinkList L);
bool ListInsert2(LinkList &L,int i,int x);
void PrintList2(LinkList L);
#endif
2、main方法
#include"LinkListHead.h"
int main()
{
LinkList L;
InitList1(L);
if(Empty1(L))
printf("\n链表为空\n");
else
printf("\n链表不为空\n");
printf("\n头插法插入数据:");
L=list_HeadInsertS(L);
PrintList(L);
printf("\n按序号插入:\n");
ListInsert(L,4,11);
PrintList(L);
printf("\n尾插法插入:\n");
ListInsertTail(L,33);
PrintList(L);
printf("\n在第5个节点前和后插入节点\n");
LNode *p0=GetNode(L);
InsertNextNode(p0,50);
InsertPriorNode(p0,49);
PrintList(L);
printf("\n按位序删除节点\n");
ListDelete(L,5);
PrintList(L);
printf("\n按节点删除\n");
LNode *p1 = GetNode(L);
DeleteNode(p1);
PrintList(L);
printf("-------%d-------",p0->data);
printf("\n按位查找第五个元素:\n");
LNode *p3 = GetElem(L,5);
printf("-----%d-----",p3->data);
printf("\n按值查找第五个元素:\n");
LNode *p4 = LocateElem(L,50);
printf("-----%d-----",p4->data);
LinkList L2 = L->next;
printf("\n按序号插入:\n");
ListInsert2(L2,8,22);
PrintList2(L2);
return 0;
}
3、单链表的相关操作
#include"LinkListHead.h"
bool InitList1(LinkList &L)
{
L=(LNode *)malloc(sizeof(LNode));
if(L==NULL)
return false;
L->next = NULL;
return true;
}
bool Empty1(LinkList L)
{
if(L->next==NULL)
return true;
else
return false;
}
LinkList list_HeadInsert(LinkList &L,int x)
{
LNode *s;
s = (LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=L->next;
L->next=s;
return L;
}
LinkList list_HeadInsertS(LinkList &L)
{
int x;
printf("\n请输入你希望的数,输入9999表示结束:\n");
scanf("%d",&x);
while(x!=9999)
{
list_HeadInsert(L,x);
scanf("%d",&x);
}
return L;
}
bool ListInsertTail(LinkList &L,int x)
{
LNode *p=L;
if(p==NULL)
return false;
while(p->next!=NULL)
p=p->next;
LNode *s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s->next = p->next;
p->next = s;
return true;
}
bool ListInsert(LinkList &L,int i,int x)
{
if(i<1)
return false;
LNode *p;
int j=0;
p = L;
while(p!=NULL && j<i-1)
{
p=p->next;
j++;
}
if(p==NULL)
return false;
LNode *s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s->next = p->next;
p->next=s;
return true;
}
bool InsertNextNode(LNode *p,int x)
{
if(p==NULL)
return false;
LNode *s = (LNode*)malloc(sizeof(LNode));
if(s==NULL)
return false;
s->data = x;
s->next = p->next;
p->next = s;
return true;
}
bool InsertPriorNode(LNode *p,int x)
{
if(p==NULL)
return false;
LNode *s = (LNode*)malloc(sizeof(LNode));
s->next = p->next;
p->next = s;
s->data = p->data;
p->data = x;
return true;
}
bool ListDelete(LinkList &L,int i)
{
if(i<1)
return false;
LNode *p = L;
int j=0;
while(p!=NULL && j<i-1)
{
p=p->next;
j++;
}
if(p==NULL)
return false;
LNode *q = p->next;
p->next = q->next;
free(q);
return true;
}
bool DeleteNode(LNode *p)
{
if(p==NULL)
return false;
LNode *q = p->next;
p->data = p->next->data;
p->next = q->next;
free(q);
return true;
}
void PrintList(LinkList L)
{
int i = 1;
LNode *temp = L->next;
while(temp != NULL)
{
printf("打印第%d个数: %d\n",i++,temp->data);
temp = temp->next;
}
return;
}
LNode* GetNode(LinkList L)
{
LNode *p = L;
for(int i=0;i<5;i++)
p=p->next;
return p;
}
LNode *GetElem(LinkList L,int i)
{
if(i<0)
return NULL;
LNode *p=L;
int j=0;
while(p!=NULL && j<i)
{
p = p->next;
j++;
}
return p;
}
LNode *LocateElem(LinkList L,int x)
{
LNode *p = L->next;
while(p!=NULL&&p->data!=x)
p=p->next;
return p;
}
bool InitList2(LinkList &L)
{
L=NULL;
return true;
}
bool Empty2(LinkList L)
{
return (L==NULL);
}
bool ListInsert2(LinkList &L,int i,int x)
{
if(i<1)
return false;
if(i==1)
{
LNode *s = (LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=L;
L=s;
return true;
}
LNode *p;
int j=1;
p=L;
while(p!=NULL && j<i-1)
{
p=p->next;
j++;
}
if(p==NULL)
return false;
LNode *s = (LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=p->next;
p->next=s;
return true;
}
void PrintList2(LinkList L)
{
int i = 1;
LNode *temp = L;
while(temp != NULL)
{
printf("打印第%d个数: %d\n",i++,temp->data);
temp = temp->next;
}
return;
}