编写一个程序,实现链式表的各种基本操作(假设链表的元素类型为学生记录,包括学号、姓名和成绩),并在此基础上设计一个主程序完成如下功能:
(1)初始化链表 LinkList;
(2)创建链表的元素(5条记录)
(3) 编写PrintList函数,输出链表LinkList所有元素;
(4) 编写LocateElement函数,查找链表元素的位置;
(5) 编写InsertElement函数,向链表中插入新元素,并调用该函数,在第 3 个元素位置上插入一条学生记录;
(6) 编写DeleteElement函数,删除链表元素,并调用该函数删除链表SeqList的第 1 个元素,输出删除后的线性表;
1、初始化链表 LinkList;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
int id;
char name[50];
}ElementType;
typedef struct Node{
ElementType data;
struct Node *next;
}Node,*LinkList;
/*初始化链表*/
void InitLinkList(LinkList &linkList)
{
linkList= (Node *)malloc(sizeof(Node));
linkList->next= NULL;
}
2、/*在指定的位置pos插入元素element*/
void InsertLinkList(LinkList &linkList,int pos,ElementType element)
{
LinkList curr = linkList;
int j;
for(j = 0; j < pos - 1;j++)
{
curr = curr->next;
}
Node *node = (Node *)malloc(sizeof(Node));
node -> data = element;
node -> next = NULL;
node->next = curr->next;
curr->next = node;
}
3、编写DeleteElement函数,删除链表元素,并调用该函数删除链表SeqList的第 1 个元素,输出删除后的线性表;
/*在指定的位置pos删除元素*/
void DeleteLinkList(LinkList &linkList,int pos)
{
LinkList curr = linkList;
LinkList q;
int j;
for(j = 0; j < pos - 1;j++)
{
curr = curr->next;
q = curr->next;
curr->next = q->next;
free(q);
}
}
/*查找元素*/
void LocateList(LinkList &linkList,ElementType element)
{
printf("要查找的元素为:%d\t%s\n",element.id,element.name);
LinkList curr = linkList->next;
for(int i=1; curr;i++)
{
if(!strcmp(curr->data.name,element.name))
{
printf("查找成功!");
return;
}
curr = curr->next;
}
printf("查找失败!\n");
}
ElementType GetLinkList(LinkList &linkList,int pos)
{
Node *node = linkList->next;
for(int i = 1;node && i < pos;i++)
{
node = node ->next;
}
return node->data;
}
void PrintLinkList(LinkList &linkList)
{
Node * node = linkList->next;
if(!node)
{
printf("链表为空!");
return;
}
for(int i = 0;node;i++)
{
printf("%d\t%s\n",node->data.id,node->data.name);
node = node->next;
}
}
4、前插法创建单链表
void CreateList_H(LinkList &linkList,int n)
{
for(int i = 0;i < n;i++)
{
Node *node = (Node *)malloc(sizeof(Node));
scanf("%d" ,&node ->data.id);
scanf("%s",node->data.name);
node ->next = linkList->next;
linkList->next = node;
}
}
5、后插法创建单链表
void CreateList_R(LinkList &linkList,int n)
{
LinkList link1 = linkList;
for(int i = 0; i < n;i++)
{
Node *node = (Node *)malloc(sizeof(Node));
scanf("%d" ,&node ->data.id);
scanf("%s",node->data.name);
node->next = node;
link1->next = node;
link1 = node;
}
}
ElementType dataArray[]={
{1,"wangming"},
{2,"lisan"},
{3,"taishanglaojun"},
{4,"meiguozhanshi"}
};
void testLinkList()
{
LinkList linkList;
InitLinkList(linkList);
/*//前插法创建单链表的测试语句
CreateList_H(linkList,2); //前插法创建单链表的测试语句
PrintLinkList(linkList); //前插法创建单链表的测试语句*/
/*//后插法创建单链表的测试语句
CreateList_R(linkList,2); //前插法创建单链表的测试语句
PrintLinkList(linkList); //前插法创建单链表的测试语句*/
//普通单链表的测试语句
//首先插入四个元素
for(int i = 0;i < 4;i++)
{
InsertLinkList(linkList,i+1,dataArray[i]);
}
printf("插入四个元素后\n");
PrintLinkList(linkList);
//再次插入一个元素
ElementType element;
element.id = 123;
strcpy(element.name,"测试1");
InsertLinkList(linkList,2,element);
printf("再次插入后\n");
PrintLinkList(linkList);
//删除第3个元素
DeleteLinkList(linkList,3);
printf("删除第3个元素后\n");
PrintLinkList(linkList);
//查找某元素
LocateList(linkList,dataArray[1]);
}
void main()
{
testLinkList();
}