以前寫的不帶頭的單鏈表實現,當時也啥也沒學,好多東西不知道,加上一心想壓縮代碼,減少情況,所以寫得不太好。
請教了老師,首先是命名問題和代碼緊湊性等的改進。還有可讀性方面的改進,多寫了一些注釋。并且因為帶頭的比較好寫,好操作,所以標準寫法也不是很長,繁瑣。
?
?
下面貼代碼
#include <stdio.h>
#include <stdlib.h>
#include <string.h>typedef struct node{int key;//數據struct node * prev;//前驅struct node * next;//后繼
}Node;
初始化(帶頭)?
Node * list;
//初始化,這里·我們list不再是NULL,而是指向了一個節點
//這個改進方便了很多操作,也不用借助二重指針把list和next統一表示了void init(Node * list)//初始化
{list = (Node *)malloc(sizeof(Node));list->next = NULL;list->prev = NULL;
}
查找(不用再判斷一下空不空)
Node * find(int key,Node * list)
{Node * head = list->next;//從頭節點后面開始找while(head != NULL && head->key != key)//找到或空跳出head = head->next;return head;
}
打印
void printList(Node * list)//打印
{Node * temp = list->next;頭節點下一個開始while(temp != NULL){printf("%d ",temp->key);temp = temp->next;}printf("\n");
}
刪除指定結點
void delete(Node * list)//刪除指定結點
{list->prev->next = list->next;前面后面指針改了,再free自己即可list->next->prev = list->prev;free(list);
}
配合一下刪除:
void deleteKey(int key,Node * list)
{delete(find(key,list));
}
頭插:
void insertHead(int key,Node * list)//頭插
{Node * newNode = (Node *)malloc(sizeof(Node));//初始化newNode->key = key;newNode->next = list->next;//賦值后繼if(list->next != NULL)//如果有后繼,賦值后繼的前指針為新結點list->next->prev = newNode;list->next = newNode;//改頭newNode->prev = list;//賦值新結點前指針
}
按下標插入
單鏈表都寫了,我就不寫長度函數和判斷非法了,用的時候注意吧。
void insert(int key,Node * list,int index)
{Node * head=list;//最后指到要插位置的前一個即可Node * newNode = (Node *)malloc(sizeof(Node));//初始化newNode->key = key;while(index--)head = head->next;newNode->next = head->next;//修改指針newNode->prev = head;head->next = newNode;
}
指定某值后插入不寫了,和這個修改指針邏輯一樣,再傳一個find配合一下就行了。
?
然后簡單測試
int main()
{Node * list = NULL;init(list);insertHead(1,list);insertHead(2,list);insertHead(3,list);printList(list);deleteKey(2,list);printList(list);insert(10,list,0);printList(list);
}
?