/*初始条件:顺序线性表L已存在,1<=i<=ListLength(L)*/
/*操作结果:删除L的第i个数据元素,并用e返回其值,L的长度-1*/
Status ListDelete(Sqlite *L, int i, ElemType *e)
{
int k;
if(L -> length == 0)
{
return ERROR;
}
if(i < 1 || i > L -> length)
{
return ERROR;
}
*e = L -> data(i - 1);
if(i < L -> length)
{
for(k = i; k < L -> length; k++)
{
L -> data(k - 1) = L -> data(k);
}
}
L -> length --;
return OK;
}
/*初始条件:顺序线性表L已存在,1<=i<=ListLength(L)*/
/*操作结果:删除L的第i个数据元素,并用e返回其值,L的长度-1*/
Status GetElem(LinkList *L, int i, ElemType *e)
{
int k;
LinkList p;
p = L -> next;
j = 1;
while(p && j < 1)
{
p = p -> next;
++j;
}
if(!p || j > i)
{
return ERROR;
}
*e = p -> data;
return OK;
}
/*初始条件:顺序线性表L已存在,1<=i<=ListLength(L)*/
/*操作结果:删除L的第i个数据元素,并用e返回其值,L的长度-1*/
Status GetElem(LinkList *L, int i, ElemType *e)
{
int k;
LinkList p,s;
p = *L;
j = 1;
while(p && j < 1)
{
p = p -> next;
j++;
}
if(!p || j > i)
{
return ERROR;
}
s = (LinkList)malloc(sizeof(Node));
s -> data = e;
s -> next = p -> next;
p -> next = s;
return OK;
}
/*初始条件:顺序线性表L已存在,1<=i<=ListLength(L)*/
/*操作结果:删除L的第i个数据元素,并用e返回其值,L的长度-1*/
Status GetElem(LinkList *L, int i, ElemType *e)
{
int k;
LinkList p,q;
p = *L;
j = 1;
while(p && j < 1)
{
p = p -> next;
j++;
}
if(!p || j > i)
{
return ERROR;
}
q = p -> next;
p -> next = q -> next;
*e = q -> data;
free(q);
return OK;
}
/*头插法建立单链表示例*/
void CreateListHead(LinkList *L, int n)
{
LinkList p;
int i;
srand(time(0));
*L = (LinkList)malloc(sizeof(Node));
(*L) -> next = NULL;
for(i = 0; i < n; i++)
{
p = (LinkList)malloc(sizeof(Node));
p -> data = rand() % 100 + 1;
p -> next = (*L) -> next;
(*L) -> next = p;
}
}
/*尾插法建立单链表示例*/
void CreateListTail(LinkList *L, int n)
{
LinkList p, r;
int i;
srand(time(0));
*L = (LinkList)malloc(sizeof(Node));
r = *L;
for(i = 0; i < n; i++)
{
p = (LinkList)malloc(sizeof(Node));
p -> data = rand() % 100 + 1;
r -> next = p;
r = p;
}
r -> next = NULL;
}
Status ClearList(LinkList *L)
{
LiskList p, q;
p = (*L) -> next;
while(p)
{
q = p -> next;
free(p);
p = q;
}
(*L) -> next = NULL;
return OK;
}
游标 | 6 | 5 | 3 | 4 | 5 | 2 | 7 | …… | 1 |
数据 | A | C | D | E | B | …… | |||
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | …… | 999 |
#define MAX_SIZE = 1000 ;
typedef struct
{
ElemType data ;
int cur ;
}Component , StaticLinkList[MAX_SIZE];
Status InitList(StaticLinkList L)
{
for(int i= 0 ; i < MAX_SIZE-1 ; ++i)
- {
- space[i].cur = i+1 ;
- }
- space[MAX_SIZE-1].cur = 0 ;
- return OK ;
}
//获取空闲分量的坐标
int Malloc_SSL(StaticLinkList L )
- {
int i = space[MAX_SIZE-1].cur ; //得到第一个结点的下标
if(space[0].cur) //如果存在备用链表
- {
- i = space[0].cur ; //得到备用链表的第一个结点的下标
- }
- space[0].cur = space[i].cur ; //备用结点的第一个结点将被使用,于是备用结点小标往后一个结点移动
- return i ;
- }
//插入新结点操作:
Status InserList(StaticLinkList L , int i , ElemType e)
- {
- int k = MAX_SIZE-1 ;
- if( i < 1 || i >Length(L)+1)
- return ERROR ;
- int j = Malloc_SSL(L) ; //得到备用链表的第一个元素
if (j) //如果元素存在
- {
- L[j].data = e ;
- for(int m = 1 ; m < i ; ++m) //得到第i-1个元素的下标
- k = L[k].cur ;
- L[j].cur = L[k].cur ; //将第i-1个元素的cur设置为新加的这个结点的下标,将新加的这个结点的下标设置为之前第i-1个元素存储的cur值
- L[k].cur = j ;
return OK ;
}
return ERROR ;
}
//删除静态链表中的元素:
Status DeleteLinkList(StaticLinkList L , int i )
- {
- if(i < 1 || i > ListLength(L))
- return ERROR ;
- int k = MAX_SIZE - 1 ;
for(int j = 1 ; j < i ; ++j) //找到第i-1个元素
- {
- k = L[k].cur ;
- }
j = L[K].cur ; //得到第i个元素的下标
L[k].cur = L[j].cur ; //将第i个元素存储的cur值赋值给第i-1个元素的cur
Free_SSL(L , j); //释放掉第i个元素,第i个元素的下标为j
return OK;
}
//其中Free_SSL就是将该下标的结点放到备用链表中去。
void Free_SSL(StaticLinkList L , int i )
- {
- L[i].cur = space[0].cur ; //将之前的备用链表的第一个结点的小标存入到L[i]的cur中
space[0].cur = i ; //下标为i的元素成为备用链表的第一个结点
- }
Status GetMidNode(LinkList L, ElemType *e)
{
LinkList search, mid;
mid = search = L;
while(search -> next != NULL)
{
if(search -> next -> next != NULL)
{
search = search -> next -> next;
mid = mid -> next;
}
else
{
search = search -> next;
}
}
*e = mid -> data;
return OK;
}
#include
#include
/*存储结构的定义*/
typedef struct CLinkList {
int data ;
struct CLinkList * next ;
}node;
int main()
{
node * pHead = NULL ;
char opp;
int find;
printf("\n1.初始化链表 \n2.插入结点 \n3.删除结点 \n4.返回结点位置 \n5.遍历链表 \n0.退出 \n请选择你的操作:\n");
while(opp != '0'){
scanf("%c",&opp);
switch(opp){
case '1':
ds_init(&pHead);
printf("\n");
ds_traverse(pHead) ;
break;
case '2':
printf("输入需要插入结点的位置?");
scanf("%d", &find);
ds_insert(&pHead,find) ;
printf("在位置%d插入值后:\n", find) ;
ds_traverse(pHead) ;
printf("\n");
break;
case '3':
printf("输入需要删除的结点位置?");
scanf("%d", &find);
ds_delete(&pHead,find) ;
printf("删除第%d个结点后:\n", find) ;
ds_traverse(pHead) ;
printf("\n");
break;
case '4':
printf("你要查找倒数第几个结点的值?");
scanf("%d", &find);
printf("元素%d所在位置:%d\n", find, ds_search(pHead,find)) ;
//ListTraverse(L);
printf("\n");
break;
case '5':
ds_traverse(pHead) ;
printf("\n");
break;
case '0':
exit(0);
}
}
return 0 ;
}
/************************************************************************/
/* 操作 */
/************************************************************************/
/*初始化循环链表*/
void ds_init(node **pNode) {
int item ;
node *temp ;
node *target ;
printf("输入结点的值,输入0完成初始化\n");
while(1) {
scanf("%d",&item) ;
fflush(stdin) ;
if(item == 0)
return ;
if((*pNode) == NULL) { /*循环链表中只有一个结点*/
*pNode = (node*)malloc(sizeof(struct CLinkList)) ;
if(!(*pNode))
exit(0) ;
(*pNode)->data = item ;
(*pNode)->next = *pNode ;
}
else {
/*找到next指向第一个结点的结点*/
for(target = (*pNode) ; target->next != (*pNode) ; target = target->next)
;
/*生成一个新的结点*/
temp = (node *) malloc(sizeof(struct CLinkList)) ;
if(!temp)
exit(0) ;
temp->data = item ;
temp->next = *pNode ;
target->next = temp ;
}
}
}
/*插入结点*/
/*参数:链表的第一个结点,插入的位置*/
void ds_insert(node ** pNode ,int i) {
node * temp ;
node * target ;
node * p ;
int item ;
int j = 1 ;
printf("输入要插入结点的值:");
scanf("%d",&item) ;
if(i == 1) { //新插入的结点作为第一个结点
temp = (node *)malloc(sizeof(struct CLinkList)) ;
if(!temp)
exit(0) ;
temp ->data = item ;
/*寻找到最后一个结点*/
for(target = (*pNode) ; target->next != (*pNode) ; target = target->next) ;
temp->next = (*pNode) ;
target->next = temp ;
*pNode = temp ;
}
else {
target = *pNode ;
for( ; j < (i-1) ; target=target->next,++ j) ;
temp = (node *)malloc(sizeof(struct CLinkList)) ;
if(!temp)
exit(0) ;
temp ->data = item ;
p = target->next ;
target->next = temp ;
temp->next = p ;
}
}
/*删除结点*/
void ds_delete(node ** pNode,int i) {
node * target ;
node * temp ;
int j = 1 ;
if(i == 1) { //删除的是第一个结点
/*找到最后一个结点*/
for(target = *pNode ; target->next != *pNode ;target = target->next) ;
temp = *pNode ;
*pNode = (*pNode)->next ;
target->next = *pNode ;
free(temp) ;
}
else {
target = *pNode ;
for( ; j < i-1 ; target= target->next,++j) ;
temp = target->next ;
target->next = temp->next ;
free(temp) ;
}
}
/*返回结点所在位置*/
int ds_search(node * pNode,int elem) {
node * target ;
int i = 1 ;
for(target = pNode ; target->data != elem && target->next != pNode ; ++i , target = target->next) ;
if(target->next == pNode) /*表中不存在该元素*/
return 0 ;
else
return i ;
}
/*遍历*/
void ds_traverse(node * pNode) {
node * temp ;
temp = pNode ;
printf("***********链表中的元素******************\n");
do {
printf("%4d ",temp->data) ;
}while((temp = temp->next) != pNode) ;
printf("\n") ;
}
(2)插入数据的时候需要考虑前后的方向的操作
(3)同样,删除数据的是有也需要考虑前后方向的操作
typedef struct _DOUBLE_LINK_NODE
{
int data;
struct _DOUBLE_LINK_NODE* prev;
struct _DOUBLE_LINK_NODE* next;
}DOUBLE_LINK_NODE;
DOUBLE_LINK_NODE* create_double_link_node(int value)
{
DOUBLE_LINK_NODE* pDLinkNode = NULL;
pDLinkNode = (DOUBLE_LINK_NODE*)malloc(sizeof(DOUBLE_LINK_NODE));
assert(NULL != pDLinkNode);
memset(pDLinkNode, 0, sizeof(DOUBLE_LINK_NODE));
pDLinkNode->data = value;
return pDLinkNode;
}
void delete_all_double_link_node(DOUBLE_LINK_NODE** pDLinkNode)
{
DOUBLE_LINK_NODE* pNode;
if(NULL == *pDLinkNode)
return ;
pNode = *pDLinkNode;
*pDLinkNode = pNode->next;
free(pNode);
delete_all_double_link_node(pDLinkNode);
}
DOUBLE_LINK_NODE* find_data_in_double_link(const DOUBLE_LINK_NODE* pDLinkNode, int data)
{
DOUBLE_LINK_NODE* pNode = NULL;
if(NULL == pDLinkNode)
return NULL;
pNode = (DOUBLE_LINK_NODE*)pDLinkNode;
while(NULL != pNode){
if(data == pNode->data)
return pNode;
pNode = pNode ->next;
}
return NULL;
}
STATUS insert_data_into_double_link(DOUBLE_LINK_NODE** ppDLinkNode, int data)
{
DOUBLE_LINK_NODE* pNode;
DOUBLE_LINK_NODE* pIndex;
if(NULL == ppDLinkNode)
return FALSE;
if(NULL == *ppDLinkNode){
pNode = create_double_link_node(data);
assert(NULL != pNode);
*ppDLinkNode = pNode;
(*ppDLinkNode)->prev = (*ppDLinkNode)->next = NULL;
return TRUE;
}
if(NULL != find_data_in_double_link(*ppDLinkNode, data))
return FALSE;
pNode = create_double_link_node(data);
assert(NULL != pNode);
pIndex = *ppDLinkNode;
while(NULL != pIndex->next)
pIndex = pIndex->next;
pNode->prev = pIndex;
pNode->next = pIndex->next;
pIndex->next = pNode;
return TRUE;
}
STATUS delete_data_from_double_link(DOUBLE_LINK_NODE** ppDLinkNode, int data)
{
DOUBLE_LINK_NODE* pNode;
if(NULL == ppDLinkNode || NULL == *ppDLinkNode)
return FALSE;
pNode = find_data_in_double_link(*ppDLinkNode, data);
if(NULL == pNode)
return FALSE;
if(pNode == *ppDLinkNode){
if(NULL == (*ppDLinkNode)->next){
*ppDLinkNode = NULL;
}else{
*ppDLinkNode = pNode->next;
(*ppDLinkNode)->prev = NULL;
}
}else{
if(pNode->next)
pNode->next->prev = pNode->prev;
pNode->prev->next = pNode->next;
}
free(pNode);
return TRUE;
}
int count_number_in_double_link(const DOUBLE_LINK_NODE* pDLinkNode)
{
int count = 0;
DOUBLE_LINK_NODE* pNode = (DOUBLE_LINK_NODE*)pDLinkNode;
while(NULL != pNode){
count ++;
pNode = pNode->next;
}
return count;
}
void print_double_link_node(const DOUBLE_LINK_NODE* pDLinkNode)
{
DOUBLE_LINK_NODE* pNode = (DOUBLE_LINK_NODE*)pDLinkNode;
while(NULL != pNode){
printf("%d\n", pNode->data);
pNode = pNode ->next;
}
}