#include <string.h>
//输入
typedef struct DataType
{
char name[10];
char num[12];
}Datatype;
Datatype InputInfo()
{
Datatype x;
printf("请输入姓名和电话号码:\n");
scanf("%s%s",&x.name,&x.num);
return x;
}
//输出
void PrintInfo(Datatype x)
{
printf("姓名:%s,电话号码:%s\n",x.name,x.num);
}
//比较姓名函数
int CompareName(Datatype a, Datatype b)
{
if (strcmp(a.name, b.name) == 0)
return 1;
else
return 0;
}
typedef struct Node
{
Datatype data;
struct Node* next;
}Node, *LinkList;
//创建带头节点的链表
void InitList(LinkList *head)
{
LinkList p = (LinkList)malloc(sizeof(Node));
p->next = NULL;
(*head) = p;
}
//查询链表长度
int LengthList(LinkList head)
{
LinkList p = head;
int length = 0;
while (p->next != NULL)
{
length++;
p = p->next;
}
return length;
}
//按内容查找元素位置,成功返回位置,失败返回0
int LocateElem(LinkList head, Datatype e, int(*fun)(Datatype, Datatype))
{
int pos = 0;
LinkList p = head->next;
while (p != NULL)
{
if ((*fun)(p->data, e) == 1)
return (pos + 1);
p = p->next;
pos++;
}
return 0;
}
//按位置返回元素,成返回1,失败返回0
int GetElem(LinkList head, int pos, Datatype *e)
{
int length = LengthList(head);
LinkList p = head;
if (pos < 1 || pos > length)
return 0;
for (int i = 0; i < pos; i++)
{
p = p->next;
}
(*e) = p->data;
return 1;
}
//按位置删除元素,成功返回1,失败返回0
int DeleteElem(LinkList head, int pos, Datatype *e)
{
int length = LengthList(head);
if (pos < 1 || pos > length)
return 0;
LinkList p = head;
LinkList q = NULL;
for (int i = 0; i < pos - 1; i++)
{
p = p->next;
}
q = p->next;
p->next = p->next->next;
(*e) = q->data;
free(q);
return 1;
}
//按位置插入元素,成功返回1,失败返回0
int InsertElem(LinkList head, int pos, Datatype e)
{
int length = LengthList(head);
if (pos < 1 || pos > length + 1)
return 0;
LinkList p = head;
LinkList pNew = (LinkList)malloc(sizeof(Datatype));
pNew->data = e;
for (int i = 0; i < pos - 1; i++)
{
p = p->next;
}
pNew->next = p->next;
p->next = pNew;
return 1;
}
//遍历链表
void TraverseList(LinkList head)
{
int length = LengthList(head);
LinkList p = head->next;
for (int i = 0; i < length; i++)
{
PrintInfo(p->data);
p = p->next;
}
}
//销毁链表
void DestroyList(LinkList head)
{
LinkList p = head;
LinkList q = p;
while (p != NULL)
{
p = p->next;
free(q);
q = p;
}
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include "DataType.h"
#include "LinkList.h"
int main()
{
int ch,pos,length;//用于输入操作数,返回位置,链表长度
Datatype x;//用来输入元素
LinkList L;
InitList(&L);
while (1)
{
system("cls");
printf("请输入要进行的操作\n");
printf("1.添加链表元素\n");
printf("2.插入链表元素\n");
printf("3.删除链表元素\n");
printf("4.修改链表元素\n");
printf("5.打印链表元素\n");
printf("6.销毁退出\n");
scanf("%d",&ch);
switch (ch)
{
case 1:
x = InputInfo();
length = LengthList(L);
if (InsertElem(L, length + 1, x))
printf("添加成功\n");
else
printf("添加失败\n");
system("pause");
break;
case 2:
x = InputInfo();
printf("请输入你要插入的位置\n");
scanf("%d",&pos);
if (InsertElem(L, pos, x))
printf("插入成功\n");
else
printf("插入失败\n");
system("pause");
break;
case 3:
printf("请输入你要删除的名字\n");
scanf("%s",&x.name);
pos = LocateElem(L, x, CompareName);
if (DeleteElem(L, pos, &x))
{
printf("删除成功\n");
PrintInfo(x);
}
else
printf("删除失败\n");
system("pause");
break;
case 4:
printf("请输入被修改的名字:\n");
scanf("%s",&x.name);
pos = LocateElem(L, x, CompareName);
if (DeleteElem(L, pos, &x))
{
printf("信息修改为\n");
x = InputInfo();
InsertElem(L, pos, x);
printf("修改成功\n");
}
else
printf("修改失败\n");
system("pause");
break;
case 5:
TraverseList(L);
system("pause");
break;
case 6:
DestroyList(L);
return;
}
}
system("pause");
return 0;
}
求大神看看为什么我的删除函数会报错啊