c语言单项链表行编译,分享下一晚上写的单项链表程序

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

// 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。

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值