该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
//单链表结点的定义
typedef struct Node
{
char data;
struct Node *next;
}*LinkList;
//子函数声明
LinkList CreateFromHead();
LinkList CreateFromTail();
void DispList(LinkList L);
void ListLength(LinkList L);
int InsertList(LinkList L, int i, char e);
char DeleteList(LinkList L, int i);
int UpdateList(LinkList L, int i, char x);
LinkList Locate(LinkList L, int i);
LinkList Get(LinkList L, char key);
int _tmain(int argc, _TCHAR* argv[])
{
int InsertResult; //插入结点设置的变量
char DeleteResult; //删除结点设置的变量
int UpdateResult; //修改结点设置的变量
int option; //功能选择变量
int i = 1;
int option2 = 0;
LinkList p = 0;
printf("请选择:1.头插法建立链表 2.尾插法建立链表, 回车结束\n");
scanf_s("%d", &option);
while (i)
{
if (option == 1)
{
p = CreateFromHead();
i = 0;
}
else if (option == 2)
{
p = CreateFromTail();
i = 0;
}
else
{
printf("输入数据有误,请重新输入\n");
scanf_s("%d", &option);
}
}
printf("创建的链表结点信息如下:\n");
DispList(p);
ListLength(p);
printf("请输入要实现的功能:1.插入 2.删除 3.按号查找 4.按值查找 5.修改信息\n");
scanf_s("%d", &option2);
char letter;
int j;
switch (option2)
{
case 1:
{
printf("请输入插入的字符\n");//插入数据
scanf_s("%c", &letter);
printf("请输入插入的位置\n");
scanf_s("%d", &j);
InsertResult = InsertList(p, j, letter);
if (InsertResult == 0)
{
printf("插入后链表结点信息如下:\n");
DispList(p);
ListLength(p);
}
break;
}
case 2:
{
printf("请输入删除的位置\n");//删除数据
scanf_s("%d", &j);
DeleteResult = DeleteList(p, j);
if (DeleteResult != -1)
{
printf("删除后链表结点信息如下:\n");
DispList(p);
ListLength(p);
printf("删除的链表结点值是 %c\n", DeleteResult);
}
}
case 3:
{
printf("请输入需要修改的位置\n");//修改数据
scanf_s("%d", &j);
printf("请输入修改后的值\n");
scanf_s("%c", &letter);
UpdateResult = UpdateList(p, j, letter);
if (UpdateResult == 0)
{
printf("修改后链表结点信息如下:\n");
DispList(p);
ListLength(p);
}
}
case 4:
{
printf("请输入需要查找的号\n");//按号查找
scanf_s("%d", &j);
if (Locate(p, j) != NULL)
{
printf("链表中第 %d 个结点的存储地址是 %x,值是 %c\n", j, Locate(p, j), Locate(p, j)->data);
}
else
{
printf("\n链表中不存在序号为 %d 的结点!\n", j);
}
}
case 5:
{
printf("请输入需要查找的内容\n");//按内容查找
scanf_s("%c", &letter);
if (Get(p, letter) != NULL)
{
printf("\n链表中结点值是 %c 的结点的存储地址是 %x\n", letter, Get(p, letter));
}
else
{
printf("\n链表中不存在结点值是 %c 的结点!\n", letter);
}
}
default:
{
printf("请重新输入功能序号\n");//错误
scanf_s("%d", &option2);
break;
}
}
return 0;
}
//头插法建立单链表
LinkList CreateFromHead()
{
LinkList L, s;
char c;
int flag = 1;
L = (LinkList)malloc(sizeof(Node));
L->data = *H*;
L->next = NULL; //建立表头
printf("请连续输入字符,并以$结束\n");
while (flag)
{
c = getchar();
if (c != *$*)
{
s = (LinkList)malloc(sizeof(Node));
s->data = c;
s->next = L->next;
L->next = s;
}
else flag = 0;
}
return L;
}
//尾插法建立单链表,有问题
LinkList CreateFromTail()
{
LinkList L,s,r;
char c;
int flag = 1;
L = (LinkList)malloc(sizeof(Node));
L->data = *H*;
L->next = NULL;
s = L;
r = L;
printf("请连续输入字符,并以$结束\n");
while (flag)
{
c = getchar();
if (c != *$*)
{
s = (LinkList)malloc(sizeof(Node));
s->data = c;
r->next = s;
r = s;
}
else
{
r->next = NULL;
flag = 0;
}
}
return L;
}
//显示单链表的结点信息
void DispList(LinkList L)
{
LinkList p = L;
while (p->next != NULL )
{
printf("链表中值为 %c 的结点的存储地址是 %x\n", p->data, p);
p = p->next;
}
}
//计算单链表的长度
void ListLength(LinkList L)
{
int i = 0;
LinkList p = L;
while (p->next!= NULL)
{
i++;
p = p->next;
}
printf("链表长度是 %d\n", i);
}
//单链表插入操作
int InsertList(LinkList L, int i, char e)
{
LinkList p, s;
p = L;
int k = 0;
while (p != NULL && k
{
p = p->next;
if (p == NULL) break;
k++;
}
if (k != i - 1)
{
printf("\n插入位置不合理,无法执行插入操作!\n");
return -1;
}
else
{
s = (LinkList)malloc(sizeof(Node));
s->data = e;
s->next = p->next;
p->next = s;
printf("\n插入成功!\n");
return 0;
}
}
//单链表删除操作
char DeleteList(LinkList L, int i)
{
LinkList p, r;
p = L;
char e;
int k = 0;
if (i<1)
{
printf("\n删除位置不合理,无法执行删除操作!\n");
return -1;
}
while (p->next != NULL && k
{
k++;
p = p->next;
}
if(k!=i-1)
{ printf("\n删除位置不合理,无法执行删除操作!\n");
return -1;
}
if (p->next == NULL)
{
printf("\n删除位置不合理,无法执行删除操作!\n");
return -1;
}
else
{
e = p->next->data;
r = p->next;
p->next = p->next->next;
free(r);
printf("\n删除成功!\n");
return e;
}
}
//修改单链表结点信息
int UpdateList(LinkList L, int i, char x)
{
LinkList p = L;
int j = 0;
while (p->next != NULL && j
{
j++;
p = p->next;
}
if (j == i)
{
p->data = x;
return 0;
}
else
printf("\n修改位置不合理,无法执行修改操作!\n");
return -1;
}
//按序号查找单链表结点
LinkList Locate(LinkList L, int i)
{
LinkList p = L;
int j = 0;
while (p->next != NULL && j
{
j++;
p = p->next;
}
if (i == j)
return p;
else
return NULL;
}
//按值查找单链表结点
LinkList Get(LinkList L, char key)
{
LinkList p = L->next;
while (p != NULL)
{
if (p->data != key)
p = p->next;
else
break;
}
return p; //如果按值找到此结点,返回此结点地址,否则返回NULL。
}