基于字符串数组的单链表的表示与实现
#pragma warning(disable:4996)
#pragma warning(disable:6011)
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#define NAME_NUMBER 50
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0
typedef char ElemType[NAME_NUMBER];
typedef int Status;
typedef struct LNode {
ElemType data;
struct LNode* next;
}LNode, * LinkList;
Status Init_List(LinkList* L)
{
*L = (LinkList)malloc(sizeof(LNode));
if (!*L)
{
exit(OVERFLOW);
}
(*L)->next = NULL;
return OK;
}
Status DerstoyList(LinkList* L) {
LinkList q;
while (*L)
{
q = (*L)->next;
free(*L);
*L = q;
}
return OK;
}
Status ClearList(LinkList L)
{
LinkList p, q;
p = L->next;
while (p)
{
q = p->next;
free(p);
p = q;
}
L->next = NULL;
return OK;
}
Status ListEmpty(LinkList L)
{
if (L->next)
{
return FALSE;
}
else {
return TRUE;
}
}
int ListLength(LinkList L) {
int i = 0;
LinkList p = L->next;
while (p)
{
i++;
p = p->next;
}
return i;
}
Status GetElem(LinkList L, int i, ElemType e[])
{
int j = 1;
LinkList p = L->next;
while (p && j < i)
{
p = p->next;
j++;
}
if (!p || j > i)
{
return ERROR;
}
strcpy(e, p->data);
return OK;
}
Status ListInsert(LinkList L, int i, ElemType e[])
{
int j = 0;
LinkList p = L, s;
while (p && j < i - 1)
{
p = p->next;
j++;
}
if (!p || j > i - 1)
return ERROR;
s = (LinkList)malloc(sizeof(LNode));
strcpy(s->data, e);
s->next = p->next;
p->next = s;
return OK;
}
Status ListDelete(LinkList L, int i, ElemType e[])
{
int j = 0;
LinkList p = L, q;
while (p->next && j < i - 1)
{
p = p->next;
j++;
}
if (!p->next || j > i - 1)
return ERROR;
q = p->next;
p->next = q->next;
strcpy(e, q->data);
free(q);
return OK;
}
Status ListTraverse(LinkList L) {
LinkList p = L->next;
int i = 1;
while (p != NULL)
{
int j = 0;
char s;
printf("第%d个元素: ", i);
while (p->data[j] != '\0')
{
putchar(p->data[j++]);
}
printf("\n");
p = p->next;
i++;
}
printf("\n");
return OK;
}
Status CreatList(LinkList* L, int n)
{
int i;
LinkList p, newnode;
*L = (LinkList)malloc(sizeof(LNode));
(*L)->next = NULL;
p = *L;
printf("请输入%d个数据\n", n);
for (i = 1; i <= n; i++)
{
int j = 0;
char s;
newnode = (LinkList)malloc(sizeof(LNode));
while (((s = getchar()) != '\n') && j < NAME_NUMBER)
{
newnode->data[j++] = s;
}
newnode->data[j] = '\0';
p->next = newnode;
p = p->next;
}
p->next = NULL;
}
char* getUserChar(char string[]) {
int i = 0;
char s;
while ((s = getchar()) != '\n')
{
string[i++] = s;
}
string[i] = '\0';
return string;
}
int main() {
int node_num;
char s[50];
LinkList La;
printf("1、创建链表并输入数据\n");
node_num = 8;
CreatList(&La, node_num);
ListTraverse(La);
printf("2、请输入插入的数据\n");
getUserChar(s);
printf("请输入插入的位置\n");
scanf_s("%d", &node_num);
ListInsert(La, node_num, s);
ListTraverse(La);
printf("3、请输入要删除的位置i\n");
scanf_s("%d", &node_num);
ListDelete(La, node_num, s);
ListTraverse(La);
printf("4、请输入要查找的位置i\n");
scanf_s("%d", &node_num);
if (GetElem(La, node_num, s))
{
printf("位置%d的元素是:\n", node_num);
int i = 0;
for (i = 0; i < strlen(s); i++)
{
putchar(s[i]);
}
}
return OK;
}