提交 fbd715b2 authored 作者: bh's avatar bh

完成单链表,单向循环链表,双向链表,双向循环链表的设计

上级 a3c91edb
.idea
*.out
*.o
\ No newline at end of file
......@@ -3,31 +3,32 @@
#include <string.h>
// 单向链表的设计
// 节点结构体
typedef struct node{
int len;
int len; // 头节点中使用,保存链表的总长度(不含头节点)
char name[10];
struct node * next;
}Node;
// 申请一个节点的空间
Node * create(){
return (Node *)malloc(sizeof(Node));
}
// 初始化一个节点
Node * initNode(){
Node * node = create();
node->len = 0;
strcpy(node->name,"node0");
strcpy(node->name,"header");
node->next = NULL;
return node;
}
//
// 头部插入数据
void headInsert(Node * head,Node * newNode){
Node * headNext = head->next;
head->next = newNode;
head->next->next = headNext;
head->len++;
}
// 尾部插入数据
void endInsert(Node * head,Node * newNode){
Node * nextNode = head;
while(nextNode->next){
......@@ -39,18 +40,31 @@ void endInsert(Node * head,Node * newNode){
head->len++;
}
// 删除一个节点,根据node->name去匹配对应的节点
void delNode(Node * head,Node * delNode){
if(head->name == delNode->name){ // 头节点,直接返回
printf("don't delete head node!\n");
return;
} else if(head->next){ // 非头节点,继续走
Node * nextNode;
Node * thisNode;
nextNode = head;
while (nextNode->next){ //
thisNode=nextNode;
nextNode=nextNode->next;
if(nextNode->name == delNode->name){
if(nextNode->next == NULL){ // 要删除的是最后一个节点
thisNode->next = NULL;
free(nextNode);
} else{ // 要删除的不是最后一个节点
thisNode->next = nextNode->next;
free(nextNode);
nextNode = thisNode->next;
}
}
}
}
void delNode(Node * head,char name[10]){
Node * nextNode ;
nextNode = head;
while(nextNode->next){
if(nextNode->name == name){
nextNode->next = nextNode->next->next;
free(nextNode->next);
head->len--;
break;
}
}
}
void printNode(Node * head){
......@@ -93,21 +107,12 @@ int main()
printNode(head);
printf("");
printf("=========del================\n");
delNode(head,head);
printNode(head);
return 0;
}
//
// Created by bh-1 on 2022/12/14.
//
#include "stdio.h"
#include "malloc.h"
#include "string.h"
// 单向循环链表
typedef struct node{
int len;
char name[10];
struct node * next;
}Node;
// 申请节点内存
Node * create(){
return (Node *) malloc(sizeof (Node));
}
Node * initNode(){
Node * head = create();
head->len = 0;
strcpy(head->name,"head");
head->next = head;
head->len++;
return head;
}
// 获取循环链表的长度
int linkLen(Node * head){
int len = 1;
Node * nextNode = head;
while (nextNode->next != head){
len++;
nextNode = nextNode->next;
}
return len;
}
// 插入一个链表
void insert(Node * head,Node * newNode){
if(head->next == head){ // 只有一个头节点
head->next = newNode;
newNode->next= head;
} else{ // 超过2个节点
Node * nextNode;
nextNode = head;
while (nextNode->next != head){
nextNode=nextNode->next;
}
nextNode->next = newNode;
newNode->next = head;
}
head->len++;
}
// 随机节点地址插入
void randInsert(Node * beforeNode,Node * newNode){
if(linkLen(beforeNode) == 1 ){ // 只有一个节点,那就只能是头节点
newNode->next = beforeNode;
beforeNode->next = newNode;
} else{ // 多个节点
newNode->next = beforeNode->next;
beforeNode->next = newNode;
}
}
// 删除一个节点
void delNode(Node * head,Node * delNode){
if((linkLen(head) == 1) || (delNode->name == head->name)){ // 不删除头节点
printf("don't delete head node");
return;
}
Node * nextNode;
Node * thisNode;
nextNode = head;
while (nextNode->next != head){
thisNode = nextNode;
nextNode = nextNode->next;
if(nextNode->name == delNode->name){
thisNode->next = nextNode->next;
free(nextNode);
head->len--;
}
nextNode = thisNode;
}
}
void printList(Node * head){
Node * nextNode;
nextNode = head;
while (nextNode->next != head){
printf("name=%s,len=%d,address=%p,next=%p\n",nextNode->name,nextNode->len,nextNode,nextNode->next);
nextNode = nextNode->next;
}
printf("name=%s,len=%d,address=%p,next=%p\n",nextNode->name,nextNode->len,nextNode,nextNode->next);
}
int main(){
Node * head = initNode();
Node * node1 = create();
strcpy(node1->name,"node1");
insert(head,node1);
Node * node2 = create();
strcpy(node2->name,"node2");
insert(head,node2);
Node * node3 = create();
strcpy(node3->name,"node3");
insert(head,node3);
Node * node4 = create();
strcpy(node4->name,"node4");
insert(head,node4);
printList(head);
printf("=====================\n");
Node * node5 = create();
strcpy(node5->name,"node5");
randInsert(node2,node5);
printList(head);
return 0;
}
//
// Created by zxsh-1 on 2022/12/14.
//
#include "stdio.h"
#include "string.h"
#include "malloc.h"
// 双向循环链表
typedef struct node{
int len;
char name[10];
struct node * next;
struct node * prev;
}Node;
Node * create(){
return (Node *) malloc(sizeof(Node));
}
// 获取链表的长度
int listLen(Node * node){
int i=1;
Node * nextNode = node;
while (nextNode->next != node){
i++;
nextNode = nextNode->next;
}
return i;
}
Node * initNode(){
Node * head = create();
head->len=0;
strcpy(head->name,"header");
head->next=head;
head->prev=head;
return head;
}
void addNode(Node * head,Node * newNode) {
if (listLen(head) == 1) {
head->next = newNode;
head->prev = newNode;
newNode->next = head;
newNode->prev = head;
} else {
newNode->prev = head;
newNode->next = head->next;
head->next->prev = newNode;
head->next = newNode;
}
}
Node * delNode(Node * head,Node * delNode){
Node * newHead = head;
if(listLen(head) == 1){
printf("only one node !");
} else{
Node * nextNode = head;
while (1){
if(nextNode->name == delNode->name){
if(nextNode == head){
newHead = nextNode->next;
}
nextNode->prev->next = nextNode->next;
nextNode->next->prev = nextNode->prev;
free(nextNode);
break;
}
nextNode=nextNode->next;
if(nextNode == newHead){
break;
}
}
}
return newHead;
}
void printList(Node * head){
Node * nextNode = head;
printf("name=%s,len=%d,prev=%p,address=%p,next=%p\n",nextNode->name,nextNode->len,nextNode->prev,nextNode,nextNode->next);
while (nextNode->next != head){
nextNode = nextNode->next;
printf("name=%s,len=%d,prev=%p,address=%p,next=%p\n",nextNode->name,nextNode->len,nextNode->prev,nextNode,nextNode->next);
}
}
int main(){
Node * head = initNode();
Node * node1 = create();
strcpy(node1->name,"node1");
addNode(head,node1);
Node * node2 = create();
strcpy(node2->name,"node2");
addNode(head,node2);
Node * node3 = create();
strcpy(node3->name,"node3");
addNode(head,node3);
Node * node4 = create();
strcpy(node4->name,"node4");
addNode(head,node4);
printList(head);
printf("------------------------------\n");
head = delNode(head,head);
printList(head);
return 0;
}
//
// Created by zxsh-1 on 2022/12/14.
//
#include "stdio.h"
#include "string.h"
#include "malloc.h"
// 双向不循环链表的设计
typedef struct node{
int len;
char name[10];
struct node * next;
struct node * prev;
}Node;
// 获取链表长度
int linkLen(Node * node){
int i=1;
while (node->next != NULL){
i++;
node = node->next;
}
return i;
}
// 申请节点空间
Node * create(){
return (Node *) malloc(sizeof(Node));
}
// 初始化头节点
Node * initHead(){
Node * head = create();
head->len = 0;
strcpy(head->name,"header");
head->next = NULL;
head->prev = NULL;
return head;
}
// 链表头部插入,并返回新的头节点
Node * headInsert(Node * head,Node * newNode){
Node * newHead = newNode;
head->prev = newHead;
newHead->next = head;
newHead->prev=NULL;
newHead->len = head->len++;
head->len = 0;
return newHead;
}
// 尾部插入节点
void endInsert(Node * head,Node * newNode){
Node * nextNode = head;
while (nextNode->next != NULL){
nextNode = nextNode->next;
}
nextNode->next=newNode;
newNode->prev=nextNode;
newNode->next=NULL;
head->len++;
}
Node * delNode(Node * head,Node * delNode){
if(linkLen(head) == 1){
printf("only one head node !");
return head;
}
if(delNode == head){ // 删除的节点是头节点
Node * newHead;
head->next->prev= NULL;
newHead = head->next;
free(head);
return newHead;
}
Node *nextNode = head;
while (nextNode->next) {
nextNode = nextNode->next;
if (nextNode->name == delNode->name) {
if (nextNode->next == NULL) { // 要删除的是最后一个节点
nextNode->prev->next = NULL;
free(nextNode);
break;
} else{ // 不是头节点,也不是尾节点
nextNode->prev->next = nextNode->next;
nextNode->next->prev = nextNode->prev;
free(nextNode);
break;
}
}
}
return head;
}
void printLinkList(Node * head){
Node * nextNode = head;
while (nextNode->next){
printf("name=%s,len=%d,prev=%p,address=%p,next=%p\n",nextNode->name,nextNode->len,nextNode->prev,nextNode,nextNode->next);
nextNode = nextNode->next;
}
printf("name=%s,len=%d,prev=%p,address=%p,next=%p\n",nextNode->name,nextNode->len,nextNode->prev,nextNode,nextNode->next);
}
int main()
{
Node * head = initHead();
Node * node1 = create();
strcpy(node1->name,"node1");
head = headInsert(head,node1);
Node * node2 = create();
strcpy(node2->name,"node2");
head = headInsert(head,node2);
Node * node3 = create();
strcpy(node3->name,"node3");
head = headInsert(head,node3);
Node * node4 = create();
strcpy(node4->name,"node4");
head = headInsert(head,node4);
Node * node5 = create();
strcpy(node5->name,"node5");
endInsert(head,node5);
Node * node6 = create();
strcpy(node6->name,"node6");
endInsert(head,node6);
Node * node7 = create();
strcpy(node7->name,"node7");
endInsert(head,node7);
Node * node8 = create();
strcpy(node8->name,"node8");
endInsert(head,node8);
printLinkList(head);
printf("-----------------------\n");
head = delNode(head,node6);
printLinkList(head);
return 0;
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论