单链表实现
//单链表定义
typedef struct {
int data;
struct LNode *next;
}LNode;
//链表基本操作
LNode* CreateLNode(int data);
LNode* CreateList(int num);
LNode* ListInsert(LNode* head,int index,int data);
LNode* DeleteList(LNode* head,int index);
bool ModifyIndex(LNode* head,int index,int data);
bool ModifyData(LNode* head,int data,int val);
bool OutputList(LNode* head);
LNode* head = CreateList(10);;
OutputList(head);
ListInsert(head,1,65);
OutputList(head);
DeleteList(head,3);
OutputList(head);
ModifyIndex(head,4,66);
OutputList(head);
ModifyData(head,65,110);
OutputList(head);
//链表基本操作
//创建节点
LNode* CreateLNode(int data){
LNode* node = (LNode*)malloc(sizeof(LNode));//申请内存
node->data = data;
node->next = NULL;
return node;
}
//创建单链表
LNode* CreateList(int num){
LNode* head = CreateLNode(1);
LNode* temp = head;
for(int i = 2;i <= num;++i){
LNode* node = CreateLNode(i);//创建新节点
temp->next = node;//头结点的下一个节点等于新节点
temp = node;//temp指针指向新节点
}
return head;
}
//获取链表的长度
int ListLen(LNode* head){
int len = 0;
while (head){
head = head->next;
len++;
}
return len;
}
//在链表指定位置插入一个节点,返回头结点
LNode* ListInsert(LNode* head,int index,int data){
if(index > ListLen(head) || index < 0){
return head;
}
else if(index = 0){
LNode* node = CreateLNode(data);
node->next = head;
head = node;
} else{
LNode* temp = head;
for(int i = 0;i < index - 1;i++){
temp = temp->next;
}
LNode* node = CreateLNode(data);
node->next = temp->next;
temp->next = node;
}
return head;
}
//删除节点
LNode* DeleteList(LNode* head,int index){
if(index > ListLen(head) || index < 0){
return head;
}else if (index == 0){
LNode* temp = head;
head = temp->next;
free(temp);
temp = NULL;
} else{
LNode* node = head;
for(int i = 0;i < index -1;i++){
node = node -> next;
}
LNode* temp = node->next;
node->next = temp->next;
free(temp);
temp = NULL;
}
}
//查找链表中指定的数据
LNode* SelectList(LNode* head,int data){
if(head == NULL){
return NULL;
}
LNode* node = head;
while (node){
if(node->data == data){
return node;
}
node = node->next;
}
return NULL;
}
//修改链表中指定位置节点的值
bool ModifyIndex(LNode* head,int index,int data){
if(index > ListLen(head) || index < 0){
return false;
}
LNode* node = head;
for(int i = 0;i < index - 1;i++){
if(node == NULL){
return false;
}
node = node->next;
}
node->data = data;
return true;
}
//修改链表中指定数据的值
bool ModifyData(LNode* head,int data,int val){
LNode* node = SelectList(head,data);
if(node){
node->data = val;
return true;
}
return false;
}
//输出链表
bool OutputList(LNode* head){
if(head == NULL){
return false;
}
LNode* node = head;
for(int i = 0;i < ListLen(head);i++){
printf("%d ",node->data);
node = node->next;
}
printf("\n");
return true;
}
双链表实现
//双链表定义
typedef struct {
int data;
struct DLNode *next;
struct DLNode *prior;
}DLNode;
int main(){
//双链表基本操作
DLNode* CreateDLNnode(int data);
DLNode* CreateDLsit(int num);
DLNode* DListInsert(DLNode* head,int index,int data);
DLNode* DeleteDList(DLNode* head,int index);
bool OutputDlist(DLNode* head);
//双链表测试
DLNode* head = CreateDLsit(10);
OutputDlist(head);
DListInsert(head,3,121);
OutputDlist(head);
DeleteDList(head,6);
OutputDlist(head);
return 0;
}
//双链表基本操作
//创建节点
DLNode* CreateDLNnode(int data){
DLNode* node = (DLNode*)malloc(sizeof(DLNode));
node->data = data;
node->next = NULL;
node->prior = NULL;
return node;
}
//创建双链表
DLNode* CreateDLsit(int num){
DLNode* head = CreateDLNnode(1);
DLNode* temp = head;
for(int i = 2;i <= num;++i){
DLNode* node = CreateDLNnode(i);
temp->next = node;
node->prior = temp;
temp = node;
}
return head;
}
//获取链表的长度
int DListLen(DLNode* head){
int num = 0;
if(head == NULL)
return 0;
DLNode* node = head;
while (node){
node = node->next;
num++;
}
return num;
}
//在指定位置插入节点,返回头节点
DLNode* DListInsert(DLNode* head,int index,int data){
if(index < 0 || index > DListLen(head)){
return head;
}
else if(index == 0){
DLNode* node = CreateDLNnode(data);
node->next = head;
head->prior = node;
head = node;
} else{
DLNode* temp = head;
for(int i = 0;i < index - 1;i++){
temp = temp->next;
}
DLNode* node = CreateDLNnode(data);
node->next = temp->next;
DLNode* tnode = temp->next;
tnode->prior = node;
temp->next = node;
node->prior = temp;
node = temp;
}
return head;
}
//删除节点
DLNode* DeleteDList(DLNode* head,int index){
if(index < 0 || DListLen(head) < index){
return head;
} else if(index == 0){
DLNode* temp = head;
head = temp->next;
head->prior = NULL;
free(temp);
temp = NULL;
} else{
DLNode* node = head;
for(int i = 0;i < index - 1;i++){
node = node->next;
}
DLNode* temp = node->next;
node->next = temp->next;
DLNode* tnode = temp->next;
tnode->prior = node;
free(temp);
temp = NULL;
}
}
//输出链表
bool OutputDlist(DLNode* head){
if(head == NULL){
return false;
}
DLNode* node = head;
//正向输出
printf("正向输出:\n");
while (node){
printf("%d ",node->data);
node = node->next;
}
printf("\n");
//反向输出
node = head;
for(int i = 1;i < DListLen(head);i++){
node = node->next;
}
printf("反向输出:\n");
for(int i = DListLen(head);i > 0;i--){
printf("%d ",node->data);
node = node->prior;
}
printf("\n");
return true;
}