wei 老师写的链表(参考)
2016-07-29 17:07
393 查看
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Node
{
int data;
struct Node *next;
};
typedef struct Node LinkList;
#define LEN sizeof(struct Node)
#define ERROR 1
#define OK 0
/* 初始化顺序线性表 */
LinkList *InitList(void)
{
LinkList *head;
head=(LinkList *)malloc(LEN); /* 产生头结点,并使L指向此头结点 */
if(head ==NULL) /* 存储分配失败 */
return ERROR;
head->next=NULL; /* 指针域为空 */
return head;
}
/* 初始条件:顺序线性表L已存在 */
/* 操作结果:链表输出,依次对L的每个数据元素输出 */
LinkList * print(LinkList *head)
{
LinkList *p=head->next;
if(p == NULL)
printf("This is a empty.\n");
while(p !=NULL)
{
printf(" %d\n", p->data);
p=p->next;
}
printf("\n");
return head;
}
/* 随机产生n个元素的值,建立带表头结点的单链线性表L(尾插法) */
LinkList * CreateListTail(LinkList *head, int n)
{
LinkList *pre,*after;
int i;
head = (LinkList *)malloc(LEN); /* L为整个线性表 */
pre=head;
after=head; /* r为指向尾部的结点 */
for (i=0; i<n; i++)
{
pre = (LinkList *)malloc(LEN); /* 生成新结点 */
scanf(" %d", &pre->data);
after->next=pre; /* 将表尾终端结点的指针指向新结点 */
after = pre; /* 将当前的新结点定义为表尾终端结点 */
}
pre->next = NULL; /* 表示当前链表结束 */
return head;
}
/* 随机产生n个元素的值,建立带表头结点的单链线性表L(头插法) */
LinkList * CreateListHead(LinkList *head, int n)
{
LinkList *p, *q;
int i;
head = (LinkList*)malloc(LEN);
head->next = NULL; /* 先建立一个带头结点的单链表 */
p=head->next;
for (i=0; i<n; i++)
{
p = (LinkList *)malloc(LEN); /* 生成新结点 */
scanf(" %d", &p->data);
p->next = head->next;
head->next = p;
/* 插入到表头 */
}
return head;
}
/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */
LinkList * ListDelete(LinkList *head,int i)
{
int j=1;
LinkList *p,*q;
p = head;
while (p->next && j < i)
/* 遍历寻找第i个元素 */
{
p = p->next;
++j;
}
if (!(p->next) || j > i)
return ERROR; /* 第i个元素不存在 */
q = p->next;
p->next = q->next;
/* 将q的后继赋值给p的后继 */
free(q); /* 让系统回收此结点,释放内存 */
return head;
}
/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L), */
/* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */
LinkList * ListInsert(LinkList *head,int i,int e)
{
int j=1;
LinkList *p,*s;
p = head;
while (p && j < i) /* 寻找第i个结点 */
{
p = p->next;
++j;
}
if (!p || j > i)
return ERROR; /* 第i个元素不存在 */
s = (LinkList *)malloc(LEN); /* 生成新结点(C语言标准函数) */
s->data = e;
s->next = p->next; /* 将p的后继结点赋值给s的后继 */
p->next = s; /* 将s赋值给p的后继 */
return head;
}
/* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 */
LinkList * ClearList(LinkList *head)
{
LinkList *p,*q;
p=head->next; /* p指向第一个结点 */
while(p) /* 没到表尾 */
{
q=p->next;
free(p);
p=q;
}
head->next=NULL; /* 头结点指针域为空 */
return head;
}
int main()
{
LinkList *head;
head=InitList();
print(head);
// head=CreateListHead(head,3);
head= CreateListTail(head, 3);
print(head);
head=ListDelete(head
9d27
,2);
print(head);
printf("insert>\n");
head=ListInsert(head,2,5);
print(head);
printf("clear>\n");
ClearList(head);
print(head);
return 0;
}
#include <string.h>
#include <stdlib.h>
struct Node
{
int data;
struct Node *next;
};
typedef struct Node LinkList;
#define LEN sizeof(struct Node)
#define ERROR 1
#define OK 0
/* 初始化顺序线性表 */
LinkList *InitList(void)
{
LinkList *head;
head=(LinkList *)malloc(LEN); /* 产生头结点,并使L指向此头结点 */
if(head ==NULL) /* 存储分配失败 */
return ERROR;
head->next=NULL; /* 指针域为空 */
return head;
}
/* 初始条件:顺序线性表L已存在 */
/* 操作结果:链表输出,依次对L的每个数据元素输出 */
LinkList * print(LinkList *head)
{
LinkList *p=head->next;
if(p == NULL)
printf("This is a empty.\n");
while(p !=NULL)
{
printf(" %d\n", p->data);
p=p->next;
}
printf("\n");
return head;
}
/* 随机产生n个元素的值,建立带表头结点的单链线性表L(尾插法) */
LinkList * CreateListTail(LinkList *head, int n)
{
LinkList *pre,*after;
int i;
head = (LinkList *)malloc(LEN); /* L为整个线性表 */
pre=head;
after=head; /* r为指向尾部的结点 */
for (i=0; i<n; i++)
{
pre = (LinkList *)malloc(LEN); /* 生成新结点 */
scanf(" %d", &pre->data);
after->next=pre; /* 将表尾终端结点的指针指向新结点 */
after = pre; /* 将当前的新结点定义为表尾终端结点 */
}
pre->next = NULL; /* 表示当前链表结束 */
return head;
}
/* 随机产生n个元素的值,建立带表头结点的单链线性表L(头插法) */
LinkList * CreateListHead(LinkList *head, int n)
{
LinkList *p, *q;
int i;
head = (LinkList*)malloc(LEN);
head->next = NULL; /* 先建立一个带头结点的单链表 */
p=head->next;
for (i=0; i<n; i++)
{
p = (LinkList *)malloc(LEN); /* 生成新结点 */
scanf(" %d", &p->data);
p->next = head->next;
head->next = p;
/* 插入到表头 */
}
return head;
}
/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */
LinkList * ListDelete(LinkList *head,int i)
{
int j=1;
LinkList *p,*q;
p = head;
while (p->next && j < i)
/* 遍历寻找第i个元素 */
{
p = p->next;
++j;
}
if (!(p->next) || j > i)
return ERROR; /* 第i个元素不存在 */
q = p->next;
p->next = q->next;
/* 将q的后继赋值给p的后继 */
free(q); /* 让系统回收此结点,释放内存 */
return head;
}
/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L), */
/* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */
LinkList * ListInsert(LinkList *head,int i,int e)
{
int j=1;
LinkList *p,*s;
p = head;
while (p && j < i) /* 寻找第i个结点 */
{
p = p->next;
++j;
}
if (!p || j > i)
return ERROR; /* 第i个元素不存在 */
s = (LinkList *)malloc(LEN); /* 生成新结点(C语言标准函数) */
s->data = e;
s->next = p->next; /* 将p的后继结点赋值给s的后继 */
p->next = s; /* 将s赋值给p的后继 */
return head;
}
/* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 */
LinkList * ClearList(LinkList *head)
{
LinkList *p,*q;
p=head->next; /* p指向第一个结点 */
while(p) /* 没到表尾 */
{
q=p->next;
free(p);
p=q;
}
head->next=NULL; /* 头结点指针域为空 */
return head;
}
int main()
{
LinkList *head;
head=InitList();
print(head);
// head=CreateListHead(head,3);
head= CreateListTail(head, 3);
print(head);
head=ListDelete(head
9d27
,2);
print(head);
printf("insert>\n");
head=ListInsert(head,2,5);
print(head);
printf("clear>\n");
ClearList(head);
print(head);
return 0;
}
相关文章推荐
- 106.网络分层模型及SOCKET/TCP/UDP/HTTP区别和联系
- 中国剩余定理2.0
- OC学习日记01
- 【Caffe】Blobs数据结构的Python表示
- Javascript实现CheckBox的全选与取消全选的代码
- AndroidJNI 通过C++调用JAVA
- FragmentTabHost和TabHost在外接键盘输入时文本框焦点异常问题
- 国际化
- Shell编程---数值运算
- 算法学习(3)----求数组中大小最接近的两个元素的差
- poj 2485 Highways
- CS109 Lecture 7
- 【BZOJ-2299】向量 裴蜀定理 + 最大公约数
- linux命令:find详解
- mac nginx + php 开发环境集成
- Android触摸事件总结
- todo
- Uoj 33 树上GCD (树分治)
- Java:万年历打印输出
- python __set__ __get__ 等解释