1、返回单链表中第pos个结点中的元素,若pos超出范围,则返回0
2、把单链表中第pos个结点的值修改为x的值,若修改成功返回1,否则返回0
3、向单链表的表头插入一个元素
4、向单链表的末尾添加一个元素
5、向单链表中第pos个结点位置插入元素为x的结点,若插入成功返回1,否则返回0
6、向有序单链表中插入元素x结点,使得插入后仍然有序
7、从单链表中删除表头结点,并把该结点的值返回,若删除失败则返回0
8、从单链表中删除表尾结点并返回它的值,若删除失败则返回0
#include <stdio.h> #include <string.h> #include <stdlib.h> typedef int Element; //定义节点结构 struct node { Element data; //数据域 struct node *next;//指针域 }; typedef struct node LinkNode; //创建单链表--不带头节点 LinkNode * createLinkList(); LinkNode * createLinkList() { LinkNode *head = NULL; //头 LinkNode *tail = NULL; //尾 LinkNode *temp = NULL; //临时的节点,指向当前创建的元素 int data; scanf("%d",&data); while (data) { temp = (LinkNode *)malloc(sizeof(LinkNode)); //temp指向该申请内存,下一次temp指向一个新的内存 if (!temp) //申请失败 { printf("malloc failed....."); } else //申请成功 { temp->data = data; //写入数据到temp数据域中 temp->next = NULL; //写入数据到temp指针域中 } if (head == NULL) //头为空的时候 { head = temp; //头指针指向temp tail = temp; //尾指针指向temp } else //头不为空的时候 { tail->next = temp; //将temp赋给指针域,下一次作next域连上data域 tail = temp; //尾指针指向temp } scanf("%d",&data);//接着输入下一个值,输入0就结束 } return head; } //输出单链表 void printLinkList(LinkNode *head); void printLinkList(LinkNode *head) { LinkNode *p = head; while (p) { printf("%d\t",p->data); p = p->next; } } //求链表长度 int length(LinkNode *head); int length(LinkNode *head) { int len = 0; LinkNode *p = head; while (p) { len++; p = p->next; } return len; } //1 int 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(重点) 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; } //通过指针修改(重点) 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)); /* //1 modifyElement(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);//此时需表是有序的,输入10到50内数 printLinkList(head); printf("\n"); deleteHeadNode(&head); printLinkList(head); printf("\n"); deleteEndNode(head); printLinkList(head); return 0; }