#include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
} LNode, *LinkList;
LinkList List_HeadInsert(LinkList &L){ //头插法
LNode *s;
int x;
L=(LinkList)malloc(sizeof(LNode));
if (L==NULL)
{
printf("内存分配不成功\n");
}
L->next=NULL;
scanf("%d",&x);
while(x!=9999){
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=L->next;
L->next=s;
scanf("%d",&x);
}
return L;
}
LinkList List_TailInsert(LinkList &L)//尾插法
{
int x;
L=(LinkList)malloc(sizeof(LNode));
LNode *s,*r=L;
scanf("%d",&x);
while(x!=9999){
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
r->next=s; //把原尾指针指向新添加元素
r=s; //更新原尾指针为新尾指针
scanf("%d",&x);
}
//r->next=NULL; //尾节点指针置空(结尾了没有下一个元素被指出故删去置空)
r->next=L; //循环单链表,尾指针指向首节点
return L;
}
void print(LinkList L) //打印链表
{
LNode *i=L;
printf("当前单链表中元素为:");
//while(i->next !=NULL) //非循环单链表的判断
while(i->next != L) //循环单链表的判断
{
i=i->next;
printf("%d\t",i->data);
}
printf("\n");
}
LNode *GetElem(LinkList L,int i) //按序查找结点,返回指针
{
if(i<1){
return NULL;
}
int j=1;
LNode *p=L->next;
while(p!=NULL&&j<i)
{
p=p->next;
j++;
}
return p;
}
LNode *LocateElem(LinkList L,int e){ //按值查找元素,并且返回该元素指针
LNode *p=L->next;
while(p!=NULL&&p->data!=e){
p=p->next;
}
return p;
}
bool HeadInsetElem(LinkList &L,int i,int e){ //前插法在特定位置插入元素
LNode* p=GetElem(L,i-1);
LNode* s;
s=(LNode*)malloc(sizeof(LNode));
if(s==NULL){
return false;
}
else {
s->data=e;
s->next=p->next;//该项与下一项不可换,否则造成指针覆盖丢失后续指针
p->next=s;
}
return true;
}
bool TailInsertElem(LinkList &L,int i,int e){ //后插法特定位置插入元素
LNode* p=GetElem(L,i); //如果已知特定结点的数据和指针,进行插入操作O(1)
LNode* s; //后插容易理解,前插就是先后插再交换数据即可
s=(LNode*)malloc(sizeof(LNode));
if(s==NULL){
return false;
}
else{
s->data=e;
s->next=p->next;
p->next=s;
}
return true;
}
int Length(LinkList L){
int len=0;
if(L==NULL) return 0;
while(L->next){
len++;
L=L->next;
}
return len;
}
bool DeleteElem(LinkList &L,int i){
LNode* q=GetElem(L,i-1); //被删除指针的前驱
LNode* p=q->next; //指向被删除结点的指针
p=q->next; //被删除的后继
q->next=p->next; //把后继给前驱
free(p);
return 0;
}
int main()
{
LNode* p;
int i,e;
bool x;
LinkList L=NULL;
while (1){
printf("****************************************\n");
printf("请输入想进行的操作?\n");
printf("1.头插法建立单链表 2.尾插法建立单链表\n");
printf("3.按照序号查找节点数据 4.按照值查找结点\n");
printf("5.添加新结点 6.删除结点\n");
printf("7.求表长 输入0以退出程序\n");
printf("*****************************************\n");
scanf("%d",&i);
if(i==0) break;
switch(i){
case 1:
printf("输入单链表数据:\n");
List_HeadInsert(L);break; //实现头插法
case 2:
printf("输入单链表数据:\n");
List_TailInsert(L); break; //实现尾插法
case 3:
printf("输入想查找数据的位数\n");
scanf("%d",&i);
p=GetElem(L,i);
printf("该数据为%d\n",p->data);
break;
case 4:
printf("输入想查找的数字:\n");
scanf("%d",&i);
p=LocateElem(L,i);
if(p){
printf("查找成功!\n");
}
else{
printf("查找失败,表内不存在\n");
}
break;
case 5:
printf("请输入想要插入的次序和数据");
scanf("%d%d",&i,&e);
x=TailInsertElem(L,i,e);
if(x)printf("成功插入\n");
else printf("插入失败\n");
break;
case 6:
printf("请输入你想删除结点的序号\n");
scanf("%d",&i);
DeleteElem(L,i);
break;
case 7:
i=Length(L);
printf("所求表长为:%d\n",i);break;
default:
printf("输入错误\n");
break;
}
print(L); //查看建成的单链表
}
}
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
} LNode, *LinkList;
LinkList List_HeadInsert(LinkList &L){ //头插法
LNode *s;
int x;
L=(LinkList)malloc(sizeof(LNode));
if (L==NULL)
{
printf("内存分配不成功\n");
}
L->next=NULL;
scanf("%d",&x);
while(x!=9999){
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=L->next;
L->next=s;
scanf("%d",&x);
}
return L;
}
LinkList List_TailInsert(LinkList &L)//尾插法
{
int x;
L=(LinkList)malloc(sizeof(LNode));
LNode *s,*r=L;
scanf("%d",&x);
while(x!=9999){
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
r->next=s; //把原尾指针指向新添加元素
r=s; //更新原尾指针为新尾指针
scanf("%d",&x);
}
r->next=NULL; //尾节点指针置空(结尾了没有下一个元素被指出故删去置空)
return L;
}
void print(LinkList L) //打印链表
{
LNode *i=L;
printf("当前单链表中元素为:");
while(i->next !=NULL)
{
i=i->next;
printf("%d\t",i->data);
}
printf("\n");
}
LNode *GetElem(LinkList L,int i) //按序查找结点,返回指针
{
if(i<1){
return NULL;
}
int j=1;
LNode *p=L->next;
while(p!=NULL&&j<i)
{
p=p->next;
j++;
}
return p;
}
LNode *LocateElem(LinkList L,int e){ //按值查找元素,并且返回该元素指针
LNode *p=L->next;
while(p!=NULL&&p->data!=e){
p=p->next;
}
return p;
}
bool HeadInsetElem(LinkList &L,int i,int e){ //前插法在特定位置插入元素
LNode* p=GetElem(L,i-1);
LNode* s;
s=(LNode*)malloc(sizeof(LNode));
if(s==NULL){
return false;
}
else {
s->data=e;
s->next=p->next;//该项与下一项不可换,否则造成指针覆盖丢失后续指针
p->next=s;
}
return true;
}
bool TailInsertElem(LinkList &L,int i,int e){ //后插法特定位置插入元素
LNode* p=GetElem(L,i); //如果已知特定结点的数据和指针,进行插入操作O(1)
LNode* s; //后插容易理解,前插就是先后插再交换数据即可
s=(LNode*)malloc(sizeof(LNode));
if(s==NULL){
return false;
}
else{
s->data=e;
s->next=p->next;
p->next=s;
}
return true;
}
int Length(LinkList L){
int len=0;
if(L==NULL) return 0;
while(L->next){
len++;
L=L->next;
}
return len;
}
bool DeleteElem(LinkList &L,int i){
LNode* q=GetElem(L,i-1); //被删除指针的前驱
LNode* p=q->next; //指向被删除结点的指针
p=q->next; //被删除的后继
q->next=p->next; //把后继给前驱
free(p);
return 0;
}
int main()
{
LNode* p;
int i,e;
bool x;
LinkList L=NULL;
while (1){
printf("****************************************\n");
printf("请输入想进行的操作?\n");
printf("1.头插法建立单链表 2.尾插法建立单链表\n");
printf("3.按照序号查找节点数据 4.按照值查找结点\n");
printf("5.添加新结点 6.删除结点\n");
printf("7.求表长 输入0以退出程序\n");
printf("*****************************************\n");
scanf("%d",&i);
if(i==0) break;
switch(i){
case 1:
printf("输入单链表数据:\n");
List_HeadInsert(L);break; //实现头插法
case 2:
printf("输入单链表数据:\n");
List_TailInsert(L); break; //实现尾插法
case 3:
printf("输入想查找数据的位数\n");
scanf("%d",&i);
p=GetElem(L,i);
printf("该数据为%d\n",p->data);
break;
case 4:
printf("输入想查找的数字:\n");
scanf("%d",&i);
p=LocateElem(L,i);
if(p){
printf("查找成功!\n");
}
else{
printf("查找失败,表内不存在\n");
}
break;
case 5:
printf("请输入想要插入的次序和数据");
scanf("%d%d",&i,&e);
x=TailInsertElem(L,i,e);
if(x)printf("成功插入\n");
else printf("插入失败\n");
break;
case 6:
printf("请输入你想删除结点的序号\n");
scanf("%d",&i);
DeleteElem(L,i);
break;
case 7:
i=Length(L);
printf("所求表长为:%d\n",i);break;
default:
printf("输入错误\n");
break;
}
print(L); //查看建成的单链表
}
}