单链表=动态内存分配+结构体+指针
单链表即单元上非连续的存储结构,有数据域和指针(地址)域。
好处:增大内存利用率,可以将各个小内存连接起来供大内存程序使用。
表头唯一代表这一个单链表。
#include <stdio.h> #include <string.h> #include <stdlib.h> typedef int Element; //修改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 ",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; } int main(int argc, const char * argv[]) { LinkNode *head = NULL; head=createLinkList(); printLinkList(head); printf("len = %d ",length(head)); return 0; }
1ex
#include <stdio.h> #include <string.h> #include <stdlib.h> typedef int Element; struct node { Element data; struct node *next; }; typedef struct node lNode; //创建链表 lNode * createLinkList(); lNode * createLinkList() { lNode *head = NULL; lNode *tail = NULL; lNode *temp = NULL; int data; scanf("%d",&data); while (data) { temp = (lNode *)malloc(sizeof(lNode)); if (!temp) { printf("没内存"); } else { temp->data = data; temp->next = NULL; } if (head == NULL) { head = temp; tail = temp; } else { tail->next = temp; tail = temp; } scanf("%d",&data); } return head; } //输出单链表 void printLinkList(lNode *head); void printLinkList(lNode *head) { lNode *p = head; while (p) { printf("%d ",p->data); p = p->next; } } //求链表长度 int len(lNode *head); int len(lNode *head) { int len = 0; lNode *p = head; while (p) { len++; p = p->next; } return len; } //把单链表中第3个结点的值修改为x的值,若修改成功返回1,否则返回0 bool update(lNode *head); bool update(lNode *head) { bool flag = false; int len = 0; lNode *p = head; while (len < 2) { len++; p = p->next; } p->data = 15; flag = 1; return flag; } //向单链表的表头插入一个元素 lNode *insertE(lNode *head); //因为表头改变了所以需要返回表头 lNode *insertE(lNode *head) { int data; printf("请输入要加入的数 "); scanf("%d",&data); lNode *temp = NULL; lNode *p = head; p = head; temp = (lNode *)malloc(sizeof(lNode)); temp->data = data; temp->next = p; p = temp; return p; } // 向单链表的末尾添加一个元素 void insertEtoTail(lNode *head); //表头没改变,不过返回数据类型为空时最好在该函数内输出。 void insertEtoTail(lNode *head) { int data; printf("请输入要加入的数 "); scanf("%d",&data); lNode *temp = NULL; lNode *p = head; temp = (lNode *)malloc(sizeof(lNode)); temp->data = data; temp->next = NULL; int length = len(head); p = head; for(int i = 0;i < length - 1;i++) { p = p->next; } p->next = temp; p = temp; } //向单链表中第pos2个结点位置hou插入元素为x的结点,若插入成功返回1,否则返回0 lNode *insertEtoX(lNode *head); lNode *insertEtoX(lNode *head) { int len = 0; lNode *p = head; lNode *n = NULL; lNode *temp = (lNode *)malloc(sizeof(lNode)); temp->data = 67; temp->next = NULL; while (len < 1) { len++; p = p->next; } n = p->next; p->next = temp; temp->next = n; return head; } //从单链表中删除表头结点,并把该结点的值返回,若删除失败则返回0 int deleteTop(lNode *head); int deleteTop(lNode *head) { lNode *p = head; head = p->next; printLinkList(head); printf("len = %d ",len(head)); return p->data; } //从单链表中删除表尾结点并返回它的值,若删除失败则返回0 int deleteTail(lNode *head); int deleteTail(lNode *head) { lNode *p = head; int length = len(head); p = head; for(int i = 0;i < length - 1;i++) { p = p->next; } int last = p->data; p = head; for(int i = 0;i < length - 2;i++) { p = p->next; } p->next = NULL; printLinkList(head); printf("len = %d ",len(head)); return last; } int main(int argc, const char * argv[]) { lNode *p = NULL; p = createLinkList(); printLinkList(p); printf("len = %d ",len(p)); //printf("修改%d ",update(p)); //printLinkList(p); // lNode *a =NULL; // a=insertE(p); // printLinkList(a); // printf("len = %d ",len(a)); // insertEtoTail(p); // printLinkList(p); // printf("len = %d ",len(p)); // lNode *x =NULL; // x = insertEtoX(p); // printLinkList(x); // printf("len = %d ",len(x)); // printf("第一个值为%d ",deleteTop(p)); printf("最后一个值为%d ",deleteTail(p)); return 0; }
1、返回单链表中第pos个结点中的元素,若pos超出范围,则返回0
2、把单链表中第pos个结点的值修改为x的值,若修改成功返回1,否则返回0
3、向单链表的表头插入一个元素
4、向单链表的末尾添加一个元素
5、向单链表中第pos个结点位置插入元素为x的结点,若插入成功返回1,否则返回0
6、向有序单链表中插入元素x结点,使得插入后仍然有序
7、从单链表中删除表头结点,并把该结点的值返回,若删除失败则返回0
8、从单链表中删除表尾结点并返回它的值,若删除失败则返回0