#include <stdio.h>
#include <stdlib.h>
#define ERROR 0
#define OK 1
typedef int ElemType;
typedef int Status;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
// 头插法建立单链表
LinkList List_Head(LinkList &L){
LNode *s; int x;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
scanf("%d", &x);
while(x!=-1){
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d", &x);
}
return L;
}
// 尾插法建立单链表
LinkList List_TailInsert(LinkList &L){
int x;
L = (LinkList)malloc(sizeof(LNode));
LNode *s, *r = L;
scanf("%d", &x);
while(x != -1){
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
scanf("%d", &x);
}
r->next = NULL;
return L;
}
LNode *ElemGet(LinkList L, int i){
if(i < 1) return ERROR;
int j = 1;
LNode *p = L->next;
if(!p || j > i) return NULL;
while(p && j < i){
p = p->next;
j++;
}
return p;
}
// 在i位置前插入节点(时间复杂度最坏为O(n))
LinkList List_Insert(LinkList &L, int i, ElemType e){
LinkList p = ElemGet(L, i - 1);
LinkList s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return L;
}
// 在i位置前插入节点(时间复杂度为O(1))
LinkList List_TailInsert(LinkList &L, int i, ElemType e){
LinkList p = ElemGet(L, i);
LinkList s = (LinkList)malloc(sizeof(LNode));
s->next = p->next;
s->data = e;
int temp = p->data;
p->data = s->data;
s->data = temp;
p->next = s;
return L;
}
// 删除前驱节点(时间复杂度O(n))
LinkList List_Del(LinkList &L, int i){
LinkList p = ElemGet(L, i - 1);
LinkList q = (LinkList)malloc(sizeof(LNode));
q = p->next;
p->next = q->next;
free(q);
return L;
}
// 删除前驱节点(时间复杂度O(1))
LinkList List_TailDel(LinkList &L, int i){
LinkList p = ElemGet(L, i);
LinkList q = (LinkList)malloc(sizeof(LNode));
q = p->next;
p->data = p->next->data;
p->next = q->next;
free(q);
return L;
}
// 输出所有元素
Status GetElem(LinkList L){
LNode *p;
p = L->next;
while(p != NULL){
printf("%d ", p->data);
p = p->next;
}
return OK;
}
// 查询表中元素是否存在某一数值
Status LocateElem(LinkList L, int i, ElemType &e){
if(i < 1) return ERROR;
LinkList p = L->next;
int j = 1;
while(p != NULL && j < i){
p = p->next;
j++;
}
if(!p || j > i) return ERROR;
e = p->data;
printf("%d", e);
return OK;
}
// 求链表的长度
Status ListLength(LinkList L){
LinkList p = L->next;
int j = 0;
while(p != NULL){
j++;
p = p->next;
}
return j;
}
int main(){
LinkList L;
/*List_Head(L);*/
List_TailInsert(L);
printf("\n");
GetElem(L);
printf("\n");
int len = ListLength(L);
printf("链表长度为:%d", len);
printf("\n");
int e;
LocateElem(L, 1, e);
printf("\n");
int n = 15;
List_Insert(L, 2, n);
GetElem(L);
printf("\n");
int c = 25;
List_TailInsert(L, 2, c);
GetElem(L);
printf("\n");
List_Del(L, 4);
GetElem(L);
printf("\n");
List_TailDel(L, 2);
GetElem(L);
printf("\n");
return 0;
}
c语言数据结构——单链表操作(全)
最新推荐文章于 2024-07-19 14:23:56 发布