String_LinkList(串的链式存储)

本文介绍了一个使用链表实现字符串操作的C语言程序,包括创建、插入、删除子串等功能,并展示了如何通过具体函数来实现这些操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*代码存在问题*/


#include<stdio.h>
typedef struct node {
char data;
struct node *next;
}linkstrnode;
typedef linkstrnode *linkstring;


void display(linkstring s);
void strconcat(linkstring *s1, linkstring s2);
void strcreate(linkstring *s)
{
char ch;
linkstrnode *p;
linkstrnode *r;
*s = NULL; 
r = NULL;
while ((ch = getchar()) != '\n')
{
p = (linkstrnode*)malloc(sizeof(linkstrnode));
p->data = ch;
if (*s == NULL)
*s = p;
else
r->next = p;
r = p;
}
//if (r != NULL)
r->next = NULL;
}


void strinsert(linkstring *s, int i, linkstring t)
{
int k=1;
linkstring p,q;
linkstring r;
p = *s;
while (p&&k < i - 1)
{
p = p->next;
++k;
}
r = p->next;
if (!p)
printf("error!\n");
else
{
q = (linkstring)malloc(sizeof(linkstrnode));
q = t;
while (q&&q->next)
q = q->next;
q->next = r;
p->next = t;
}

}


void strdele(linkstring *s, int i, int len)
{
int k = 1;
linkstring p, q;
p = *s;
while (p&&k < i - 1)
{
p = p->next;
++k;
}
if (!p)
printf("error!\n");
else
{
k = 0;
q = p->next;
while (k < len-1)
{
q = q->next;
++k;
}
p->next = q->next;
}
}


void strconcat(linkstring *s1, linkstring s2)
{
linkstring p;
if (!(*s1))
{
*s1 = s2;
return;
}
else
if (s2)
{
p = *s1;
while (p->next)
p = p->next;
printf("找到尾部1!\n");
p->next = s2;
while (s2->next)
s2 = s2->next;
printf("找到尾部2!\n");
s2->next = NULL;
}
}


linkstring substring(linkstring s, int i, int len)
{
int k; linkstring p, q, r, t;
p = s;
k = 1;
while (p&&k < i)
{
p = p->next;
k++;
}
if (!p)
{
printf("error!");
return NULL;
}
else
{
r = (linkstring)malloc(sizeof(linkstrnode));
r->data = p->data; r->next = NULL;
k = 1;
q = r;
while (p->next&&k < len)
{
p = p->next;
k++;
t = (linkstring)malloc(sizeof(linkstrnode));
t->data = p->data;
q->next = t;
q = t;
}
if (k < len)
{
printf("error 2");
return NULL;
}
else
{
q->next = NULL;
return r;
}
}
}


void display(linkstring s)
{
linkstrnode *r= s;
while (r!=NULL)
{
printf("%5c", r->data);
r = r->next;
}
putchar('\n');
}


void main()
{
linkstring *S;
S = (linkstring *)malloc(sizeof(linkstring));
*S = NULL;
strcreate(&S);
display(S);
linkstring *T;
T = (linkstring *)malloc(sizeof(linkstring));
*T = NULL;
strcreate(&T);
display(T);
strinsert(&S, 3, T);//对T造成了影响
printf("strinsert:");
display(S);
strdele(&S, 3, 1);
printf("strdele:");
display(S);
linkstring a;
a=substring(S, 3, 6);
printf("substring:");
display(a);
strconcat(&a, T);
printf("strconcat:");
display(a);
display(T);
}

以下是完善后的代码实现,包括 `Input_L`、`Length_L` 和 `Output_L` 函数的完整实现: ```cpp #include <iostream> #include <cstring> #include <iomanip> #define OK 1 #define ERROR 0 #define OVERFLOW -2 using namespace std; typedef struct { // 图书信息定义 char no[20]; // 图书ISBN char name[50]; // 图书名字 float price; // 图书价格 } Book; typedef struct LNode { // 图书信息表的链式存储结构 Book data; // 结点的数据域 int length; // 链表的表长,即图书表中图书个数 struct LNode *next; // 指针域 } LNode, *LinkList; int InitList_L(LinkList &L) { // 构造一个空的单链表L L = new LNode; L->next = NULL; L->length = 0; // 初始化表长为0 return OK; } int Input_L(LinkList &L) { // 链表的输入 char choice; do { LNode *newNode = new LNode; cout << "请输入图书ISBN: "; cin >> newNode->data.no; cout << "请输入图书名称: "; cin.ignore(); // 忽略换行符 cin.getline(newNode->data.name, 50); cout << "请输入图书价格: "; cin >> newNode->data.price; newNode->next = L->next; // 插入到链表头部 L->next = newNode; L->length++; // 表长加1 cout << "是否继续输入(Y/N): "; cin >> choice; } while (choice == 'Y' || choice == 'y'); return OK; } int Length_L(LinkList &L) { // 求链表的表长,即图书表中图书个数 cout << "当前图书表中共有 " << L->length << " 本书" << endl; return L->length; } int Output_L(LinkList L) { // 链表的输出 LNode *p = L->next; // p指向第一个节点 if (p == NULL) { cout << "图书表为空!" << endl; return ERROR; } cout << setw(20) << "ISBN" << setw(50) << "书名" << setw(10) << "价格" << endl; while (p != NULL) { cout << setw(20) << p->data.no << setw(50) << p->data.name << setw(10) << fixed << setprecision(2) << p->data.price << endl; p = p->next; } return OK; } int main() { LinkList L; // 定义一个LinkList类型的变量L InitList_L(L); // 初始化一个空的链表L Input_L(L); // 输入链表数据 Length_L(L); // 求链表的表长并输出 Output_L(L); // 输出链表数据 return 0; } ``` ### 上述代码解释: 1. **`InitList_L`**: - 初始化一个空的单链表,分配头结点空间,并将 `next` 指针置为 `NULL`。 - 同时初始化链表的长度为 `0`。 2. **`Input_L`**: - 循环输入图书信息(ISBN、书名和价格),每次输入后创建一个新的节点插入到链表头部。 - 使用 `cin.ignore()` 来忽略换行符,确保 `cin.getline` 能正确读取书名。 - 提供用户选择是否继续输入,直到用户选择停止。 3. **`Length_L`**: - 返回链表的长度,并打印当前链表中的图书数量。 4. **`Output_L`**: - 遍历链表并以表格形式输出每本书的信息(ISBN、书名和价格)。 - 如果链表为空,则提示用户图书表为空。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值