单链表基本操作实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验2 链表的操作

实验容:

1)基础题:编写链表基本操作函数,链表带有头结点

(1)CreatList_h()//用头插法建立链表

(2)CreateList_t()//用尾插法建立链表

(3)InsertList()向链表的指定位置插入元素

(4)DeleteList()删除链表中指定元素值

(5)FindList()查找链表中的元素

(6)OutputList()输出链表中元素

2)提高题:

(1)将一个头节点指针为heada的单链表A分解成两个单链表A和B,其头结点指针分别为heada和headb,使得A表中含有原单链表A中序号为奇数的元素,B表中含有原链表A中序号为偶数的元素,且保持原来的相对顺序。

(2)将一个单链表就地逆置。

即原表(a1,a2,。。。。。。 an),逆置后新表(an,an-1,。。。。。。。a1)

/*

程序功能 :单链表基本功能操作

编程者 :天啸

日期 :2016-04-14

版本号 :3.0

*/

#include

#include

typedef struct List

{

int data;

struct List *next;

}List;

void CreatList_h(List *L) //头插法

{

int i = 0;

int n = 0;

int goal;

List *p;

printf("请输入数据的个数:\n");

scanf("%d",&n);

L -> next = NULL;

for(i=0;i

{

printf("请输入第%d个数:\n",i+1);

scanf("%d",&goal);

p = (struct List*)malloc(sizeof(struct List));

p -> data = goal;

p -> next = L->next; //将L指向的地址赋值给p;

L -> next = p;

}

}

void CreateList_t(List *L) //尾插法

{

int i;

int n;

int goal;

List *p;

List *q=L;

printf("请输入数据的个数:\n");

scanf("%d",&n);

for (i=0;i

{

printf("请输入第%d个数:\n",i+1);

scanf("%d",&goal);

p = (struct List*)malloc(sizeof(struct List));

p -> data = goal;

q -> next = p;

q = p;

}

q -> next = NULL;

}

void InsList(List *L,int i,int e) //插入

{

List *s;

List *p = L;

int j = 0;

while (p&&j

{

p = p->next;

++j;

}

s = (struct List*)malloc(sizeof(struct List));

s -> data = e; //插入L中

s -> next = p -> next;

p -> next = s;

return ;

}

void DeleteList(List*L,int e) //删除

{

List *q;

List *p = L;

while (p->next&&p->next->data!=e)

{

p = p -> next;

}

if (!(p->next))

{

printf("不存在该元素!\n");

exit(0);

}

q = p -> next;

p -> next = q->next;

e = q -> data;

free(q);

return ;

}

void FindList(List*L,int e) //查找元素{

int j = 1;

List *p = L->next;

while (p&&p->data!=e)

{

p = p->next;

++j;

}

if (!p)

{

printf("不存在该元素!\n");

exit(0);

}

printf("您查找的元素位置为:%d\n",j);

return ;

}

void DisPlay(List *L) //输出链表

{

List *p = L->next;

printf("您输入的数据为:\n");

while (p!=NULL)

{

printf ("%d ",p->data);

p = p -> next;

}

printf("\n");

}

void Inverse(List*L) //单链表就地逆置

{

List *q;

List *p = L->next;

L -> next = NULL;

while (p != NULL)

{

q = p -> next; //q指针保留原链表当前处理节点的下一个节点

p -> next = L -> next; //将当前处理节点p插入到逆置L的表头

L -> next = p;

p = q; //p指向下一个待插入的节点

}

}

void DisCreat(List*L) //链表拆分

{

int i = 0; //i记录表A中结点的序号

List *p;

List *B = (struct List*)malloc(sizeof(struct List)); //创建 B 表表头

B -> next = NULL; //B表初始化

List*ra = L,*rb = B; //ra和rb将分别指向将创建的A 表和B表的尾结点

p = L -> next; //p指向待处理的结点

相关文档
最新文档