#include <stdio.h>
#include <stdlib.h>
typedef struct LNode {
int data;
struct LNode *next;
} LNode,*ListLink;
ListLink InitListLink(ListLink &L) {
L = (LNode *)malloc(sizeof(LNode));
if(!L) return NULL;
L->next = NULL;
return L;
}
ListLink headCreateListLink(ListLink &L) {
InitListLink(L);
LNode *s,*p = L;
int x;
while(scanf("%d",&x) != EOF) {
if(x == -1) break;
s = (LNode *) malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
}
return L;
}
ListLink tailCreateListLink(ListLink &L) {
InitListLink(L);
LNode *s,*r = L;
int x;
while(scanf("%d",&x) != EOF) {
if(x == -1) break;
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
}
r->next = NULL;
return L;
}
LNode* getElem(ListLink &L,int i) {
LNode *p = L;
int j = 0;
while(p->next != NULL && j < i ) {
p = p->next ;
j ++;
}
return p;
}
LNode* locateElem(ListLink &L,int e) {
LNode *p = L->next;
while(p != NULL && p->data != e) {
p = p->next;
}
return p;
}
int length(ListLink &L) {
int len = 0;
LNode *p = L;
while(p->next != NULL) {
p = p->next;
len ++;
}
return len;
}
bool insertNextNode(LNode *p,int e) {
if(!p) return false;
LNode *s;
s = (LNode *)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
bool insertNode(ListLink &L,int i,int e) {
LNode *p = getElem(L,i - 1);
insertNextNode(p,e);
return true;
}
bool insertPrionNodeE(LNode *p,int e) {
if(!p) return false;
LNode *s;
s = (LNode *)malloc(sizeof(LNode));
s->next = p->next;
p->next = s;
s->data = p->data;
p->data = e;
return true;
}
bool insertPriorNode(LNode *p,LNode *s) {
if(!p || !s) return false;
s->next = p->next;
p->next = s;
int temp = p->data;
p->data = s->data;
s->data = temp;
return true;
}
bool deleteNode(ListLink &L,int i,int &e) {
LNode *q;
LNode *p = getElem(L,i - 1);
q = p->next;
e = q->data;
p->next = q->next;
free(q);
return true;
}
bool deletePositionNode(LNode *p) {
if(p->next == NULL) return false;
LNode *q = p->next;
p->next = q->next;
p->data = q->data;
free(q);
return true;
}
void print(ListLink &L) {
LNode *p = L->next;
while(p) {
printf("%d ",p->data);
p = p->next;
}
printf("\n");
return ;
}
int main() {
ListLink L;
tailCreateListLink(L);
printf("-------------尾插法建立单链表--------------\n");
print(L);
printf("-------------按位查找:返回第 2 个节点--------------\n");
LNode *p = getElem(L,2);
printf("%d\n",p->data);
printf("-------------按值查找:返回数值是 8 的节点--------------\n");
LNode *value = locateElem(L,8);
printf("%d\n",value->data);
printf("-------------单链表的长度--------------\n");
printf("%d\n",length(L));
printf("-------------后插操作,在节点 p 之后插入元素 999--------------\n");
insertNextNode(p,999);
printf("-------------后插操作,在节点 p 之后插入元素 999 的单链表:--------------\n");
print(L);
printf("-------------插入操作: 在第 4 个位置插入元素 10000000 (带头节点)--------------\n");
insertNode(L,4,10000000);
printf("-------------插入操作: 在第 4 个位置插入元素 10000000 (带头节点) 的单链表:--------------\n");
print(L);
printf("-------------前插操作: 在 P 节点前插入元素 555--------------\n");
insertPrionNodeE(p,555);
printf("-------------前插操作: 在 P 节点前插入元素 555 的单链表:--------------\n");
print(L);
printf("-------------前插操作: 在节点 p 之前插入节点 s--------------\n");
LNode *s;
s = (LNode *)malloc(sizeof(LNode));
s->data = 666;
s->next = NULL;
LNode *q = getElem(L,4);
insertPriorNode(q,s);
printf("-------------前插操作: 在节点 q 之前插入节点 s 后的单链表:--------------\n");
print(L);
printf("-------------删除操作: 删除位序 i 的节点, e 是 i 节点的值--------------\n");
int e;
deleteNode(L,5,e);
printf("删除的值是 %d\n",e);
printf("-------------删除操作: 删除位序 i 的节点, e 是 i 节点的值 的单链表:--------------\n");
print(L);
printf("-------------删除指定节点 m:--------------\n");
LNode *m = getElem(L,2);
deletePositionNode(m);
printf("-------------删除指定节点 m 后的单链表:--------------\n");
print(L);
return 0;
}
|