学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
***************************************************
更多精彩,歡迎進入:http://shop115376623.taobao.com
***************************************************
鏈表是最簡單的一種數據結構,是每個軟件開發者必須掌握的,也是企業招聘時最常考的內容,因此,在這里總結一下單鏈表的一些基本操作。
注:這里是單向無環鏈表,頭結點中存放了數據,換句話說就是頭結點和其他結點沒什么區別,你也可以說成不帶頭結點的鏈表。下面就是鏈表操作的源代碼:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
??? int data;
??? struct Node *next;
}Lnode;
void printList(Lnode *head);
Lnode *createList();
Lnode *insertList(Lnode *head,int elem,int position);
Lnode *deleteElem(Lnode *head,int elem);
Lnode *reverseList(Lnode *head);
?
int main()
{
??? Lnode *head;
??? int elem,position;
??? head = createList();
??? printList(head);
??? printf("Input the element and the position:/n");
??? scanf("%d %d", &elem, &position);
??? head = insertList(head,elem,position);
??? printList(head);
??? head = reverseList(head);
??? printf("After reversed:/n");
??? printList(head);
????
??? printf("Input the element you want to delete:/n");
??? scanf("%d",&elem);
??? head = deleteElem(head, elem);
??? printList(head);
????
??? return 0;
}
?
/*傳入表頭指針,打印鏈表*/
void printList(Lnode *head)
{
??? Lnode *p = head;
??? if (p == NULL)
??? {
??????? printf("List is empty!/n");
??????? return;
??? }
??? while (p != NULL)
??? {
??????? printf("%d ", p->data);
??????? p = p->next;
??? }
??? printf("/n");
}
?
/*創建一個新鏈表,返回表頭指針*/
Lnode *createList()
{
??? Lnode *head, *current, *p;
??? int data;
??? head = (Lnode *)malloc(sizeof(Lnode));???
??? p = head;
??? printf("Input integers,0 to break:/n");
??? scanf("%d",&data);
????
??? if (data != -1)
??? {
??????? p->data = data;
??? }
??? else
??? {
??????? head->next = NULL;?? //只有頭結點的情況
??????? return head;
??? }
??? while (1)
??? {
??????? scanf("%d", &data);
??????? if (data == -1)
??????? {
??????????? break;
??????? }
??????? current = (Lnode *)malloc(sizeof(Lnode));
??????? current->data = data;
??????? p->next = current;
??????? p = p->next;
??? }
??? p->next = NULL;
??? return head;
}
?
/*鏈表的插入操作,head為鏈表表頭,elem為要插入的元素,position為插入的位置
?*將elem插入至第position個結點后,position<=0時,插入至頭結點后
*/
Lnode *insertList(Lnode *head,int elem,int position)
{
??? Lnode *current, *p;
??? int i = position - 1;
??? current = head;
??? /*找到第position個節點*/
??? while (i > 0 && current->next != NULL)
??? {
??????? current = current->next;
??????? i--;
??? }
??? if (i > 0)?? //結點數小于輸入的位置position
??? {
??????? printf("Position is wrong!/n");
??????? return head;
??? }
??? p = (Lnode *)malloc(sizeof(Lnode));
??? p->data = elem;
??? p->next = current->next;
??? current->next = p;
????
??? return head;
}
?
/*刪除鏈表head中所有的元素elem,返回頭結點head*/
Lnode *deleteElem(Lnode *head,int elem)
{
??? Lnode *p = head;
??? Lnode *ptemp;
??? int flag = 0;? //記錄便表中elem的個數
??? while (1)
??? {
??????? if (head->data == elem)? //刪除頭結點的情況
??????? {
??????????? flag++;
??????????? head = head->next;
??????????? free(p);
??????????? p = head;
??????? }
??????? else
??????? {
??????????? break;
??????? }
??? }
??? while (p->next != NULL)
??? {
??????? if (p->next->data == elem )
??????? {
??????????? flag++;
??????????? ptemp = p->next;
??????????? if (p->next->next != NULL)
??????????? {
??????????????? p->next = p->next->next;
??????????????? free(ptemp);
??????????????? ptemp = NULL;
??????????? }
??????????? else //最后一個結點
??????????? {
?????????????? free(ptemp);
?????????????? ptemp =NULL;
?????????????? p->next = NULL;
?????????????? break;
??????????? }
??????? }
??????? else? //沒有刪除結點時,查詢下一個結點
??????? {
??????????? p = p->next;
??????? }
??? }
??? printf("%d number '%d' was found and deleted./n", flag, elem);
??? return head;
}
?
/*將鏈表逆序,該鏈表不帶頭結點。*/
Lnode *reverseList(Lnode *head)
{
??? Lnode *current, *pnext, *ptemp;
??? current = head;
??? pnext = head->next;
??? head->next =NULL;
??? while (pnext != NULL)
??? {
??????? ptemp = pnext->next;
??????? pnext->next = current;
??????? current = pnext;
??????? pnext = ptemp;
??? }
??? head = current;
??? return head;
}
總結
以上是生活随笔為你收集整理的学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: latex表格手把手超详细教程(tabl
- 下一篇: vs2010创建和使用动态链接库(dll