复习资料上有部分内容存在问题,我自己改写了一些细枝末节的东西,整理后最终代码如下:
#include<stdio.h>
#include<malloc.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode, *LinkList;
/* -1- 头插法建立单链表*/
LinkList List_HeadInsert(LinkList &L){
LNode *temp;//中间结点
int x;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
while(x!=9999){
scanf("%d",&x);
temp = (LNode*)malloc(sizeof(LNode));
temp-> data = x;
temp->next = L->next;
L->next = temp;
}
return L;
}
/* -2- 尾插法建立单链表*/
LinkList List_TailInsert(LinkList &L){
int x;
L = (LinkList)malloc(sizeof(LNode));
LNode *temp, *t = L;//t为表尾指针
while(x!=9999){
temp = (LNode*)malloc(sizeof(LNode));
temp->data = x;
t->next = temp;
t = temp;
scanf("%d",&x);
}
t->next = NULL;//尾结点指针置空
return L;
}
/* -3- 获取单链表中的元素*/
int Get_Element(LinkList &L){
LNode *temp = L->next;
while(temp->next){
temp = temp->next;
printf("%d ",temp->data);
}
printf("\n");
}
/* -4- 按序号查找结点值*/
LNode *Find_Element(LinkList L,int i){
int j = 1;//计数
LNode *temp = L->next;//头结点指针赋给temp
if(i==0)
{
return L;//返回头结点
}
if(i<0)
{
printf("访问位置不合法!");
}
else{
while(temp && j < i+1){
temp = temp->next;
j++;
}
return temp;
}
}
/* -5- 按值查找表结点*/
int Locate_Element(LinkList L,int i){
LNode *temp = L->next;
int m = 0;
while(temp && temp->data != i){
temp = temp->next;
m++;
}
return m;
}
/* -6- 插入结点(后插)*/
LNode *Insert_Element1(LinkList L,int i,int e){
LNode *previous = L->next;
int m = 0;
while(previous && m<i){
previous = previous->next;
m++;
}
LNode *temp = (LinkList)malloc(sizeof(LNode));
temp->data = e;
temp->next = previous->next;
previous->next = temp;
return L;
}
/* -7- 插入结点(前插)*/
LNode *Insert_Element2(LinkList L,int i,int e){
i--;
Insert_Element1(L,i,e);
return L;
}
/* -8- 删除结点*/
LNode *Delete_Element(LinkList L,int i){
LNode *previous = L->next;
int m = 1;
while(previous && m<i){
previous = previous->next;
m++;
}
LNode *del_elem = previous->next;
previous->next = previous->next->next;
free(del_elem);
return L;
}
/* -9- 求单链表长度*/
int length_list(LinkList L){
LNode *temp = L->next;
int m = 0;
while(temp){
temp = temp->next;
m++;
}
return m;
}
int main(){
LinkList L;
printf("\t请对单链表建立方式进行选择:\n");
printf("\t==1.头插法\n");
printf("\t==2.尾插法\n");
int flag;
scanf("%d",&flag);
switch(flag)
{
case(1):
{
printf("\t请依次输入数据:\n\t");
printf("====================\n");
List_HeadInsert(L);
Get_Element(L);
break;
}
case(2):
{
printf("\t请依次输入数据:\n\t");
printf("====================\n");
List_TailInsert(L);
Get_Element(L);
break;
}
}
printf("\t*****请进行选择:\n");
printf("\t==1.按序号查找结点值==\n");
printf("\t==2.按值查找表结点==\n");
printf("\t==3.在指定序列 后 插入元素==\n");
printf("\t==4.在指定序列 前 插入元素==\n");
printf("\t==5.删除指定序列的元素==\n");
printf("\t==6.求单链表元素个数==\n");
int selection;
scanf("%d",&selection);
switch(selection)
{
case(1):
{
printf("\t请输入要查询的序号:\n");
int m;
scanf("%d",&m);
LNode *temp = Find_Element(L,m);
printf("在单链表中第 %d 个结点的值为 %d ",m,temp->data);
break;
}
case(2):
{
printf("\t请输入要查找的结点:\n");
int m;
scanf("%d",&m);
int temp = Locate_Element(L,m);
printf("值为 %d 的结点所在的位置是单链表的第 %d 个",m,temp);
break;
}
case(3):
{
printf("\t请输入要插入元素的序列:\n");
int m;
scanf("%d",&m);
printf("\t请输入要插入的元素值:\n");
int e;
scanf("%d",&e);
Insert_Element1(L,m,e);
Get_Element(L);
break;
}
case(4):
{
printf("\t请输入要插入元素的序列:\n");
int m;
scanf("%d",&m);
printf("\t请输入要插入的元素值:\n");
int e;
scanf("%d",&e);
Insert_Element2(L,m,e);
Get_Element(L);
break;
}
case(5):
{
printf("\t请输入要删除的元素序列:\n");
int m;
scanf("%d",&m);
Delete_Element(L,m);
Get_Element(L);
break;
}
case(6):
{
int length = length_list(L);
printf("单链表中元素个数为【%d】",length-1);
}
}
return 0;
}运行结果: