无表头单链表增删改查操作
生活随笔
收集整理的這篇文章主要介紹了
无表头单链表增删改查操作
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1、返回單鏈表中第pos個(gè)結(jié)點(diǎn)中的元素,若pos超出范圍,則返回0
2、把單鏈表中第pos個(gè)結(jié)點(diǎn)的值修改為x的值,若修改成功返回1,否則返回0
3、向單鏈表的表頭插入一個(gè)元素
4、向單鏈表的末尾添加一個(gè)元素
5、向單鏈表中第pos個(gè)結(jié)點(diǎn)位置插入元素為x的結(jié)點(diǎn),若插入成功返回1,否則返回0
6、向有序單鏈表中插入元素x結(jié)點(diǎn),使得插入后仍然有序
7、從單鏈表中刪除表頭結(jié)點(diǎn),并把該結(jié)點(diǎn)的值返回,若刪除失敗則返回0
8、從單鏈表中刪除表尾結(jié)點(diǎn)并返回它的值,若刪除失敗則返回0
?
#include <stdio.h> #include <string.h> #include <stdlib.h>typedef int Element; //定義節(jié)點(diǎn)結(jié)構(gòu) struct node {Element data; //數(shù)據(jù)域struct node *next;//指針域 };typedef struct node LinkNode; //創(chuàng)建單鏈表--不帶頭節(jié)點(diǎn) LinkNode * createLinkList(); LinkNode * createLinkList() {LinkNode *head = NULL; //頭LinkNode *tail = NULL; //尾LinkNode *temp = NULL; //臨時(shí)的節(jié)點(diǎn),指向當(dāng)前創(chuàng)建的元素int data;scanf("%d",&data);while (data){temp = (LinkNode *)malloc(sizeof(LinkNode)); //temp指向該申請(qǐng)內(nèi)存,下一次temp指向一個(gè)新的內(nèi)存if (!temp) //申請(qǐng)失敗 {printf("malloc failed.....");}else //申請(qǐng)成功 {temp->data = data; //寫入數(shù)據(jù)到temp數(shù)據(jù)域中temp->next = NULL; //寫入數(shù)據(jù)到temp指針域中 }if (head == NULL) //頭為空的時(shí)候 {head = temp; //頭指針指向temptail = temp; //尾指針指向temp }else //頭不為空的時(shí)候 {tail->next = temp; //將temp賦給指針域,下一次作next域連上data域tail = temp; //尾指針指向temp }scanf("%d",&data);//接著輸入下一個(gè)值,輸入0就結(jié)束 }return head; }//輸出單鏈表 void printLinkList(LinkNode *head); void printLinkList(LinkNode *head) {LinkNode *p = head;while (p){printf("%d\t",p->data);p = p->next;} }//求鏈表長(zhǎng)度 int length(LinkNode *head); int length(LinkNode *head) {int len = 0;LinkNode *p = head;while (p){len++;p = p->next;}return len; } //1int modifyElement(LinkNode *head,int pop,int newElement); int modifyElement(LinkNode *head,int pop,int newElement) {int succss = 0;if (pop <= 0 || pop > length(head)){printf("oops:pos is invalid");return succss;}LinkNode *p = head;for (int i = 0; i < pop - 1; i++){p = p->next;}if (p){p ->data = newElement;succss = 1;}return succss; }//2(重點(diǎn)) int insertElementToHead(LinkNode **head,Element e); int insertElementToHead(LinkNode **head,Element e) {int success = 0;LinkNode *tmp = NULL;if (e){tmp = (LinkNode *)malloc(sizeof(LinkNode));tmp->data = e;tmp->next = NULL;}else{printf("zero is invalid");return 0;}//通過指針修改(重點(diǎn))tmp->next = *head; //連接*head = tmp; //修改地址return success; }//3 int insertElementToEnd(LinkNode *head,Element e); int insertElementToEnd(LinkNode *head,Element e) {int success = 0;LinkNode *p = head;LinkNode *tmp = NULL;if(e){tmp = (LinkNode *)malloc(sizeof(LinkNode));tmp->data = e;tmp->next = NULL;}else{printf("zero is invalid");return 0;}while (p && p->next) {p = p->next;}p->next = tmp;return success; }int insertElementToPos(LinkNode *head,Element e,int pos); int insertElementToPos(LinkNode *head,Element e,int pos) {int success = 0;LinkNode *p = head;LinkNode *tmp = NULL;if (pos <= 0 && pos >length(head)){return success;}for (int i = 0; i < pos -2; i++) {p = p->next;}tmp = (LinkNode *)malloc(sizeof(LinkNode));tmp->data = e;tmp->next = NULL;if (p){tmp->next = p->next;p->next = tmp;success = 1;}return success; }int insertOrderLinkList(LinkNode *head,Element x); int insertOrderLinkList(LinkNode *head,Element x) {int success = 0;LinkNode *p = head;int loc = 1;while (p){if(p->data < x){p = p->next;loc++;}else{break;}}//此處還要分3種情況頭尾中間success = insertElementToPos(head,x,loc);return success; }int deleteHeadNode(LinkNode **head); int deleteHeadNode(LinkNode **head) {int data = 0;LinkNode *p = *head;data = p->data;*head = p->next;return data;}int deleteEndNode(LinkNode *head); int deleteEndNode(LinkNode *head) {LinkNode *p = head;LinkNode *q = NULL;int data = 0;for (int i = 0; i < length(head) - 2 ; i++){p = p->next;}q = p->next;data = q->data;p->next = NULL;free(q);return data; }int main(int argc, const char * argv[]) {LinkNode *head = NULL;head=createLinkList();printLinkList(head);printf("len = %d\n",length(head));/*//1modifyElement(head,2,54);printLinkList(head);printf("\n");insertElementToHead(&head,90);//printLinkList(head);printf("\n");insertElementToEnd(head,70);printLinkList(head);printf("\n");insertElementToPos(head,100,3);printLinkList(head);printf("\n"); */insertOrderLinkList(head,23);//此時(shí)需表是有序的,輸入10到50內(nèi)數(shù) printLinkList(head);printf("\n");deleteHeadNode(&head);printLinkList(head);printf("\n");deleteEndNode(head);printLinkList(head);return 0; }?
?
轉(zhuǎn)載于:https://www.cnblogs.com/huen/p/3497532.html
總結(jié)
以上是生活随笔為你收集整理的无表头单链表增删改查操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle 配置监听和本地网络服务
- 下一篇: Nginx 安装与启动