文章作者:姜南(Slyar) 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。
本来不想发这么水的代码,可是最近也没什么好写的…纯当凑文章数目吧…
这是一个线性表操作的小玩具,此篇为链表版本,也就是用指针和动态内存分配的。
/*
线性链表操作
Slyar 2009.3.26
//www.slyar.com
*/
#include
#include
/* 定义链表节点类型 */
typedef struct node
{
int data;
struct node *next;
}linklist;
/* 函数声明部分 */
linklist* Get(linklist*, int);
linklist* CreateList();
void FreeList(linklist*);
void Output(linklist*);
void AppendNode(linklist*, int);
void InsertNode(linklist*, int, int);
void ReadNode(linklist*, int);
void SearchFromList(linklist*, int);
void DeleteNode(linklist*, int);
void UpdateNode(linklist*, int, int);
void ListList(linklist*);
/* 主函数 */
int main()
{
int key,pos;
char ch;
linklist *slist;
slist = CreateList();
while(1){
Output(slist);
printf("请选择:");
ch=getchar();
fflush(stdin);
if(ch == 'a')
{
printf("请输入要追加的数据:");
scanf("%d",&key);
fflush(stdin);
AppendNode(slist,key);
Output(slist);
}
else
if(ch == 'i')
{
printf("请输入要插入的数据的位置:");
scanf("%d",&pos);
fflush(stdin);
printf("请输入要插入的数据:");
scanf("%d",&key);
fflush(stdin);
InsertNode(slist,key,pos);
Output(slist);
}
else
if(ch == 'd')
{
printf("请输入要删除的数据的位置:");
scanf("%d",&pos);
fflush(stdin);
DeleteNode(slist,pos);
Output(slist);
}
else
if(ch == 'r')
{
printf("请输入要读取的数据的位置:");
scanf("%d",&pos);
fflush(stdin);
ReadNode(slist,pos);
Output(slist);
}
else
if(ch == 'u')
{
printf("请输入要修改的数据的位置:");
scanf("%d",&pos);
fflush(stdin);
printf("请输入要修改的数据:");
scanf("%d",&key);
fflush(stdin);
UpdateNode(slist,key,pos);
Output(slist);
}
else
if(ch == 's')
{
printf("请输入要查找的数据:");
scanf("%d",&key);
fflush(stdin);
SearchFromList(slist,key);
Output(slist);
}
else
if(ch == 'e')
{
FreeList(slist);
exit(0);
}
}
system("pause");
return 0;
}
/* 打印说明文档 */
void Output(linklist *list)
{
system("cls");
printf("--------------------------------------\n");
printf("- 欢迎使用线性链表 -\n");
printf("- -\n");
printf("- 用法: -\n");
printf("- a: 追加一个节点 -\n");
printf("- i: 插入一个节点 -\n");
printf("- d: 删除一个节点 -\n");
printf("- r: 读取指定节点的值 -\n");
printf("- u: 修改指定节点的值 -\n");
printf("- s: 查找链表 -\n");
printf("- e: 退出 -\n");
printf("--------------------------------------\n");
ListList(list);
}
/* 创建线性链表 */
linklist* CreateList()
{
linklist *head, *r;
head = (linklist*) malloc(sizeof(linklist));
if (head == NULL)
{
printf("内存不足,无法分配!\n");
system("pause");
}
else
{
r = head;
r -> next = NULL;
}
return head;
}
/* 打印线性链表 */
void ListList(linklist* head)
{
linklist *p;
p = head -> next;
printf("当前链表的状态:\n");
if(p == NULL)
{
printf("当前链表为空\n");
}
else
{
while(p != NULL)
{
printf("[%d]", p -> data);
p = p -> next;
}
printf("\n");
}
}
/* 读取节点 */
void ReadNode(linklist* head, int pos)
{
int j = 0;
linklist *p;
p = head;
while((p -> next != NULL) && (j < pos))
{
p = p -> next;
j++;
}
if (pos == j)
{
printf("位置%d中的数据是:%d\n", pos, p -> data);
}
else
{
printf("所读取的位置超出链表的范围\n");
}
system("pause");
}
/* 查找节点 */
void SearchFromList(linklist* head, int n)
{
int i = 0, sign = 0;
linklist *p;
p = head -> next;
while(p != NULL)
{
if(p -> data == n)
{
sign = 1;
printf("在位置[%d]处找到此数据\n", i+1);
}
i++;
p = p -> next;
}
if (!sign)
{
printf("找不到此数据!\n");
}
system("pause");
}
/* 追加节点 */
void AppendNode(linklist* head, int n)
{
linklist *p, *s;
p = head;
while(p -> next != NULL)
{
p = p -> next;
}
s = (linklist*) malloc(sizeof(linklist));
if (s == NULL)
{
printf("内存不足,无法追加!\n");
system("pause");
}
else
{
s -> data = n;
s -> next = p -> next;
p -> next = s;
}
}
/* 得到节点位置 */
linklist* Get(linklist* head, int i)
{
int j = 0;
linklist *p;
p = head;
while((p -> next != NULL) && (j < i))
{
p = p -> next;
j++;
}
if (i == j)
{
return p;
}
else
{
return NULL;
}
}
/* 插入节点 */
void InsertNode(linklist* list, int n, int pos)
{
linklist *p, *s;
int j = pos - 1;
p = Get(list, j);
if (p == NULL)
{
printf("所插入的位置超出范围\n");
system("pause");
}
else
{
s = (linklist*) malloc(sizeof(linklist));
if (s == NULL)
{
printf("内存不足,无法插入!\n");
system("pause");
}
else
{
s -> data = n;
s -> next = p -> next;
p -> next = s;
}
}
}
/* 删除节点 */
void DeleteNode(linklist* head, int pos)
{
linklist *p;
int j = pos - 1;
p = Get(head, j);
if ((p != NULL) && (p -> next != NULL))
{
linklist *r;
r = p -> next;
p -> next = r -> next;
free(r);
}
else
{
printf("所要删除的位置超出链表的范围\n");
system("pause");
}
}
/* 编辑节点 */
void UpdateNode(linklist *head, int n, int pos)
{
linklist *p;
p = Get(head, pos);
if (p == NULL)
{
printf("所读取的位置超出链表的范围\n");
system("pause");
}
else
{
p -> data = n;
}
}
/* 释放链表 */
void FreeList(linklist* p)
{
if (p -> next != NULL)
{
FreeList(p -> next);
}
free(p);
}
转载请注明:Slyar Home » 线性表玩具之链表版本(C语言)